Примеры двух кодов ниже оба добавляют узл в верхней части связанного списка. Но в то время как первый пример кода использует двойной указатель на втором примере кода использует один указатель
, пример 1:
struct node* push(struct node **head, int data)
{
struct node* newnode = malloc(sizeof(struct node));
newnode->data = data;
newnode->next = *head;
return newnode;
}
push(&head,1);
. Пример 2:
struct node* push(struct node *head, int data)
{
struct node* newnode = malloc(sizeof(struct node));
newnode->data = data;
newnode->next = head;
return newnode;
}
push(head,1)
Оба стратегии работают. Однако многие программы, которые используют связанный список, используют двойной указатель для добавления нового узла. Я знаю, что такое двойной указатель. Но если бы один указатель будет достаточно, чтобы добавить новый узел, почему много реализации полагаются на двойные указатели?
Есть ли случай, когда один указатель не работает, поэтому нам нужно идти на двойной указатель?
Я думаю, что Ваш беспорядок мог бы прибыть из того, что обе функции имеют параметр, названный head
. Два head
на самом деле разные вещи. head
в первом коде хранит адрес главного указателя узла (который самого хранит адрес главной структуры узла). Принимая во внимание, что второе head
хранилища адрес главной структуры узла непосредственно. И так как обе функции возвращают недавно созданный узел (который должен быть новой головой), я думаю, что нет никакой потребности пойти для первого подхода. Вызывающие стороны этой функции ответственны для обновления главной ссылки, которую они имеют. Я думаю, что второй достаточно хорош и простой посмотреть . Я пошел бы со вторым.