Как указатели работают с двусвязными списками в 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
объекты для создания связанного списка.
Эти объекты могут находиться в статически распределенном массиве объектов или динамически размещаемых объектах.
Создание связанного списка из статически размещенного массива
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]); }
Создание связанного списка из динамически размещаемых объектов
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
в зависимости от того, какой метод вы используете для размещения объектов.