Как указатели работают с двусвязными списками в C?

Если я создаю следующую структуру:

typedef struct node {
    int a;
    char b[100][15];
    struct node *prev;
    struct node *next;
} Scope;

Должен ли я использовать указатель для инициализации моего head_node? В настоящее время это моя функция инициализации:

Scope initScope() {
    Scope head;
    head.a = 1;
    head.prev = NULL;
    head.next = NULL;
    return head;
}

В какой-то функции я бы сказал

Scope head = initScope();

Пока что это нормально для меня, но я не уверен, как я буду создавать новый узел. Я предполагаю, что мне понадобится указатель типа Scope. Я должен был распределить его по размеру Scope, а затем инициализировать его значения. Должен ли я сделать то же самое при создании головы? Основной вопрос, на который я пытаюсь ответить, - какова цель указателя здесь? Что если в определении моей структуры я написал

*Scope

вместо

Scope

? Если мне нужно использовать указатели для создания узлов, то почему бы не сделать struct указателем? Исходя из моего понимания, указатели позволяют мне манипулировать памятью, так что же остается, когда я создаю узел и двигаюсь дальше?

1 ответ

Пока что это нормально для меня, но я не уверен, как я буду создавать новый узел.

prev а также next члены Scope объект должен указывать на другой Scope объекты для создания связанного списка.

Эти объекты могут находиться в статически распределенном массиве объектов или динамически размещаемых объектах.

  1. Создание связанного списка из статически размещенного массива

    Scope scopes[10];
    scopes[0].prev = NULL;
    scopes[9].next = NULL;
    for (int i = 0; i < 9; ++i )
    {
        scopes[i].next = &(scopes[i+1]);
        scopes[i+1].pref = &(scopes[i]);
    }
    
  2. Создание связанного списка из динамически размещаемых объектов

    Scope* node = malloc(sizeof(*node));
    node->next = node->prev = NULL;
    for ( int i = 0; i < 9; ++i )
    {
       Scope* temp = malloc(sizeof(*temp));
       temp->prev = NULL;
       temp->next = node;
       node->prev = temp;
       node = temp;
    }
    

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

    Scope* scopes = malloc(10*sizeof(*scopes));
    

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

    Вам нужно будет использовать правильные звонки free в зависимости от того, какой метод вы используете для размещения объектов.

Другие вопросы по тегам