Чем отличается головной узел от других узлов при отправке их в работу? - PullRequest
1 голос
/ 18 марта 2020

Я изучаю связанный список, и я видел этот код об удалении узлов из связанного списка:

struct Node {
    char* data;
    Node* next;
};
Node* head = NULL;
void delete(int index) {//not removing head node
    if (head == NULL)
    {
      printf("error no info!")
    }
    else {
        Node* temp = find(head, index - 1);//this function will find position of node we want to delete and check if position existed in list

            Node* t = temp->next;
            temp->next = temp->next->next;
            free(t);
            return;
    }
}
void RemoveHead(Node** head)
{
    Node* temp = (*head)->next;
    free(*head);
    *head = temp;
}

Я не понимаю, почему для вставки или удаления узла из первого списка мне нужно отправить **head моим функциям, иначе он не будет работать (void RemoveHead), но для других узлов списка отправка *head пойдет на пользу (void delete1).

Вы можете мне это объяснить? Спасибо за помощь.

1 Ответ

3 голосов
/ 18 марта 2020

Здесь я предполагаю, что подпись delete на самом деле void delete(Node *head, int index); и что у вас есть void RemoveHead(Node** head); для первого узла.

Разница в том, что RemoveHead должен изменить значение указатель head. Поскольку C передает все параметры по значению, вы должны передать адрес любого выходного параметра. Из-за этого вы должны дать RemoveHead адрес указателя, следовательно, другую подпись.

В отличие от этого, delete only использует значение указателя head, и оно сохраняет значение при возврате функции, поэтому нет необходимости передавать адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...