#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
не будут изменены.
С помощью второй функции вы находите фактический последний узел в списке и добавляете новый узел в конец.