Двойной указатель в связанном списке - PullRequest
0 голосов
/ 03 апреля 2020

Я почти понял этот код, но есть две детали, которые я не могу понять. Я нашел этот код на YouTube. источник: https://www.youtube.com/watch?v=VOpjAHCee7c

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int vaule;
    struct node *next;
}node_t;

void printlist(node_t *head)
{
    node_t *temp = head;

    while(temp != NULL)
    {
        printf("%d - ", temp->vaule);
        temp = temp->next;
    }
    printf("\n");
}

node_t *create_node(int var)
{
    node_t *res = malloc(sizeof(node_t));
    res->vaule = var;
    res->next = NULL;

    return res;
}

node_t *insert_at_head(node_t **head, node_t *node_to_insert)
{
    node_to_insert->next = *head;
    *head = node_to_insert;

    return node_to_insert;          
}

void find_node()

int main()
{
    node_t *tmp;
    node_t *head = NULL;

    for(int i = 0; i < 15; i++)
    {
        tmp = create_node(i);
        head = insert_at_head(&head, tmp);
    }

    printlist(head);

    return 0;
}

1) Почему мы используем вложенную структуру?

typedef struct node{
    int vaule;
    struct node *next;
}node_t;

Я знаю о вложенных структурах, но не понимаю почему мы используем его здесь.

2) Почему мы используем двойной указатель?

node_t *insert_at_head(node_t **head, node_t *node_to_insert)
{
    node_to_insert->next = *head;
    *head = node_to_insert;

    return node_to_insert;          
}

, если я изменю этот код следующим образом:

node_t *insert_at_head(node_t *head, node_t *node_to_insert)
{
    node_to_insert->next = head;


    return node_to_insert;          
}

, тогда ничего не будет изменение

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

1) Почему мы используем вложенную структуру?

Это не вложенная структура, а связанный список. Каждый узел имеет указатель на следующий узел (или на NULL для последнего узла списка

2). Почему мы используем двойной указатель?

C только передает параметры по значению. Идиоматические c способы изменить переменную из вызывающей стороны:

  1. назначить возвращаемое значение этой переменной. Это лучший способ, но вы можете вернуть только одно единственное значение таким образом
  2. передать указатель на переменную и использовать указатель для изменения значения. Поскольку мы хотим изменить значение head, которое уже является указателем, мы должны передать указатель на указатель.

Здесь при записи кода было решено изменить переданный заголовок на явно покажите, что это параметр ввода / вывода, а также возвращает его, потому что у него нет лучшего значения для возврата.

0 голосов
/ 03 апреля 2020
  1. Почему мы используем вложенную структуру? Это не вложенная структура. struct node *next является указателем , и, как указывает его имя, указывает на следующий элемент.

  2. Почему мы используем двойной указатель? Прочитайте это: Как изменить указатель, который был передан в функцию в C?

...