C Связанный список с Sentinel - Получение доступа к узлам - PullRequest
0 голосов
/ 07 апреля 2020

Я изо всех сил пытаюсь выполнить эту задачу (Реализация связанного списка ). Я пытался построить так называемый дозорный, который должен облегчить это. У меня вопрос, как мне получить доступ к фактическим элементам? Я попытался напечатать значение корней (44), но получаю только несвязанные значения. Я предполагаю, что это адреса памяти (например, 6893440).

#include<stdio.h>

struct node {
    int val;
    struct node* next;
};

struct node** init() {
    struct node **l;
    l = malloc(sizeof(struct node**));
    *l = NULL;
    return l;
}

void insert(struct node** l, int val) {
    struct node* p;
    if(*l == NULL) {
        p = malloc(sizeof(struct node));
        p->val = val;
        p->next = *l;
        *l = p;
    }
}

void main() {
    struct node* list;
    list = init();
    insert(list, 44); // create a (root)node with value 44
    printf("%d", list->val); // e.g. 6893440
}

Большое спасибо за помощь.

1 Ответ

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

Вы должны объявить список как двойной указатель на узел.

struct node** list;

Затем вы можете получить доступ к значению первого узла с помощью

(*list)->val

Дополнительная информация:

В реализации в типах данных, таких как списки в C, мы часто используем 2 определения типа, чтобы помочь с удобочитаемостью кода и устранить множество звездочек и амперсандов. Это:

typedef struct node* ListNode;
typedef ListNode* List;

Таким образом, вы можете объявить список просто:

List list;

Обратите внимание, что реализация функций списка также становится более читабельной, заменяя struct node* и struct node** соответственно.

...