2015-08-29 3 views
-4

В приведенном ниже кодеграмме выдается сообщение об ошибке, я понятия не имею, почему. Следующая функция заключается в том, чтобы вставить узел в конец связанного списка.Вставка узла в конец связанного списка

struct Node { 
    int data; 
    struct Node *next; 
}; 

Node* Insert(struct Node *head,int data) 
{ 
    struct Node *p; 
    p=head; 
    struct Node *prev; 
    struct Node *temp=(struct Node*)malloc(sizeof(struct Node)); 
    temp->data=data; 
    temp->next=NULL; 

    if(head==NULL){ 
     head=temp; 
     return head; 
     //return temp; 
    }           `` 
    while(p!=NULL){ 
     prev=p; 
     p=p->next; 
    } 
    p=temp;//If we change this line to prev->next=temp .It is giving the correct result 
    return head; 
} 

В приведенном выше коде если заменить строку (p=temp;) с prev->next=temp он работает. Пожалуйста, помогите мне понять логику этого. Спасибо заранее. Вопрос от hackrank.

+2

Try думать: что будет происходить с 'p' после выполнения задания? – qrdl

+1

Если два указателя указывают на одно и то же место памяти, изменение одного не меняет другого. Оба указателя полностью разделены. Если вы хотите изменить другой указатель, вы также можете использовать указатель на указатель. Но это значительно усложнит ситуацию. – wimh

+0

[Не набрасывать возвращаемое значение 'malloc'.] (Http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – MC93

ответ

0

Вы назначаете вновь созданному узлу значение p.Это часть права. Однако предыдущий узел не знает адрес этого вновь созданного последнего элемента, так как prev->next присваивается NULL. Таким образом, вы должны назначить предыдущий следующий указатель на temp, чтобы временная точка узла была привязана к вашему списку. Просто до окончания цикла while p имеет некоторое значение, но следующий указатель присваивается NULL. Так что в следующий раз prev имеет некоторые данные, а следующий указатель - NULL. Вы не изменяете этот следующий указатель, чтобы указать на следующий узел, который является темпом. Назначение темпа только на стр. Поэтому последний temp не связан с этим списком.

После попытки петли:

p=temp; 
prev->next=p; 

Или просто

prev->next=temp; 
+0

Что вы имеете в виду? не можем назначить узел после достижения указателя NULL ?? – Vikas

+0

Да, вы можете, и вы этого не делаете. Получившийся второй последний элемент имеет следующий указатель, назначенный NULL, а не временному узлу. –

+0

Я меняю значение на p от NULL до адреса temp, где temp-> next = NULL. Правильно ли я в соответствии с моим кодом? – Vikas

Смежные вопросы