Связанный список вставить конечный узел в C

#c #linked-list

Вопрос:

В настоящее время я изучаю связанный список на C и пытаюсь написать функцию для вставки узла в конце, а затем распечатать все данные.

Сначала моя функция не работала (печатается только 1 2)

 struct node {
    int data;
    struct node *link;
};

void add_end(struct node *head, int a){
    struct node *current, *temp;
    current = head;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->data = a;
    temp->link = NULL;
    while(current != NULL){
        current = current->link;
    }
   current = temp;
};

int main()
{
struct node *head;
head = (struct node *)malloc(sizeof(struct node));
head->data = 1;
head->link = NULL;

struct node *current;
current = (struct node *)malloc(sizeof(struct node));
current->data = 2;
current->link = NULL;

head->link = current;

add_end(head, 3);

current = head;

while(current != NULL){
    printf("%dn", current-> data);
    current = current->link;
    }

return 0;
}
 

Через некоторое время исправление сработало ( 1 2 3 напечатаны )

 void add_end(struct node *head, int a){
    struct node *current, *temp;
    current = head;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->data = a;
    temp->link = NULL;
    while(current->link != NULL){
        current = current->link;
    }
   current->link = temp;
};
 

Может ли кто-нибудь сказать мне, почему первый не сработал, пожалуйста. Я думал, что они одинаковы, потому что в первой версии: current-это ссылка последнего узла, которая является адресом следующего узла (null), а во второй версии: current — >ссылка-это ссылка последнего узла, которая также является адресом следующего узла (null).

Комментарии:

1. Первый не работает, потому что окончательное назначение current не вносит абсолютно никаких изменений в сам список; все, что он делает, — это изменяет то, на что указывает локальная переменная current . После этого функция существует, и выделенная память утекает. И второй будет работать только в том случае, если head ссылается на начальный узел при создании функции. Без этого он тоже не будет работать (и фактически вызовет неопределенное поведение).

Ответ №1:

Один раз current NULL вы уже прошли последний узел в списке и current являетесь NULL указателем.

Присвоение ему не добавит узел в список, он просто переназначится current , чтобы больше не быть NULL указателем, но последние узлы link не будут изменены.

С помощью второй функции вы находите фактический последний узел в списке и добавляете новый узел в конец.