Это вопрос интервью в разделе "Крекинг интервью с кодированием". Мой код и тестовые примеры:
#include<iostream>
using namespace std;
struct node
{
int data;
node* next;
};
node* init(int a[], int n);
void remove(node* & c);
void printList(node* head);
int main()
{
int a[]={0,1,2,3,4,5,6,7,8,9};
node* testHead=init(a, 10);
printList(testHead);
cout<<endl;
int nth=9;
node *c=testHead;
for(int i=0; i<nth; i++)
{
c=c->next;
}
remove(c);
printList(testHead);
system("PAUSE");
return 0;
}
node* init(int a[], int n)
{
node *head, *p;
for(int i=0; i<n; i++)
{
node *nd=new node();
nd->data=a[i];
if(i==0)
{
head=nd;
p=nd;
}
else
{
p->next=nd;
p=nd;
}
}
return head;
}
void remove(node* & c)
{
if(c==NULL)
return;
node* tmp=c->next;
if(tmp==NULL)
{
delete c;
c=NULL;
}
else
{
c->data=tmp->data;
c->next=tmp->next;
delete tmp;
}
}
void printList(node* head)
{
while(head!=NULL)
{
cout<<head->data<<" ";
head=head->next;
}
}
Здесь, в основной функции, я попытался удалить последний узел со значением 9. Однако даже в функции "удалить" я проверил последний узел, и если это так, я установил его в NULL, вывод будет выдавать ошибка. Может ли кто-нибудь сказать мне, почему это происходит?
Благодарю.
Проблемы на самом деле выглядят следующим образом:
void remove(node* & c) // --> 1
{
if(c==NULL)
return;
node* tmp=c->next;
if(tmp==NULL)
{
delete c; // --> 2
c=NULL; // --> 3
}
else
{
c->data=tmp->data;
c->next=tmp->next;
delete tmp;
}
}
Это то, что нужно:
//Check @WhozCraig comment for correction
delete
выпуски c
выделенной памятиNULL
для c
Другое слово, как вы можете назначить NULL
переменной, которая была выпущена?
next
указателем от предыдущего узла илиhead
указателя в случае первого узла. Это делает удаление абсолютно тривиальным, так как вам не нужно поддерживать указатель на узел, который содержит указатель на жертву.