Как причина использования двойного указателя при добавлении узла в связанном списке?

Примеры двух кодов ниже оба добавляют узл в верхней части связанного списка. Но в то время как первый пример кода использует двойной указатель на втором примере кода использует один указатель

, пример 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)

Оба стратегии работают. Однако многие программы, которые используют связанный список, используют двойной указатель для добавления нового узла. Я знаю, что такое двойной указатель. Но если бы один указатель будет достаточно, чтобы добавить новый узел, почему много реализации полагаются на двойные указатели?

Есть ли случай, когда один указатель не работает, поэтому нам нужно идти на двойной указатель?

44
задан lord.garbage 9 July 2015 в 09:51
поделиться

1 ответ

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

0
ответ дан 26 November 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: