Проблема с указателем в связанном списке - PullRequest
0 голосов
/ 09 декабря 2018

Как и большинство новичков в C, я реализую простой связанный список.

Каждый узел списка определен так:

typedef struct list_node {
    void * data;
    struct list_node * next;
} list_node_t;

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

list_node_t * node = NULL;

list_iter_reset(list, node);

if (node == NULL) {
    printf("Node is NULL.\n");
} else {
    printf("Node is not NULL.\n");
}
fflush(stdout);

Функция list_iter_reset() определена ниже.Обратите внимание, что list->head не указывает на NULL, поскольку я вставил узлы в список ранее.

void list_iter_reset(list_t list, list_node_t * node)
{
    node = list->head;

    if (node == NULL) {
        printf("Node is NULL.\n");
    } else {
        printf("Node is not NULL.\n");
    }
    fflush(stdout);
}

Результат выполнения этого кода следующий:

Node is not NULL.
Node is NULL.

Так как я передаю указатель на узел функции, почему созданный узел в тестовой программе все еще указывает на NULL после вызова этой функции?

Я предполагаю, что простой арифметический аспект указателя прошел через мойголова здесь.Я искал вокруг и не мог найти подобную проблему.

Заранее спасибо.

1 Ответ

0 голосов
/ 09 декабря 2018

Функция изменяет значение указателя, но никогда не возвращается к вызывающей стороне.Кажется, вы хотите передать в функцию указатель на указатель (list_node_t**), а не обычный указатель.

void list_iter_reset(list_t list, list_node_t** node)
{
    *node = list->head;

    ...
}

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

Для сравнения представьте, что вы передали бы int функции и ожидали, что функция изменит ее int.Вам, конечно, придется сдать int*, верно?Это то же самое, за исключением замены int на node*, поэтому вам необходимо передать указатель на этот тип, который в данном случае равен node**

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