Вы можете посмотреть на связанный список, как на коробках, связанных друг с другом:
______ ______ ______
| data | | data | | data |
|______| |______| |______|
| next | | next | | next |
|______|----->|______|----->|______|----->NULL
Где каждая коробка ваша:
struct LinkedList
{
int data; /* The data part of the linked list */
struct LinkedList *next; /* The pointer part of the linked list */
};
Размер ваших "коробок" (зависитпо арке) давайте возьмем x64 машинку Linux равную 16 байтам.Для создания типа данных связанного списка вам необходимо сохранить эти поля в памяти (стек / куча) и соединить их.
Как я заметил, размер одного байта составляет 16 байт, и он должен храниться в памяти.Для управления памятью в пользовательском пространстве вы можете использовать malloc()
, важная вещь здесь malloc()
ничего не «объявляет» это выделять только часть памяти для вашего одного «ящика» в куче, и вы запрашиваете ровно 16 байтов для вашего «ящика» с помощью оператора sizeof()
.
struct LinkedList *head = malloc(sizeof(struct LinkedList));
Он выделяет память для вашего «ящика» итеперь это выглядит так:
______
| data |
|______|
| next |
|______|----->NULL
Когда вы делаете это:
head->next = malloc(sizeof(struct LinkedList));
Вы выделяете память для другой "коробки" и соединяете их:
______ ______
| data | | data |
|______| |______|
| next | | next |
|______|----->|______|
Когда вы делаете это:
struct LinkedList *head = malloc(sizeof(struct LinkedList));
struct LinkedList *second = malloc(sizeof(struct LinkedList));
struct LinkedList *third = malloc(sizeof(struct LinkedList));
Вы создаете три "коробки" где-то в памяти по 16 байт каждый.И они пока не подключены, они только расположены в памяти;
head second third
______ ______ _____
| data | | data | | data |
|______| |______| |______|
| next | | next | | next |
|______| |______| |______|
И вы подключили их, делая это:
head->next = second;
second->next = third;
third->next = NULL;
head second third
______ ______ ______
| data | | data | | data |
|______| |______| |______|
| next | | next | | next |
|______|----->|______|----->|______|----->NULL
Обычно второй подход используется в функции, как для ex add_node_front()
void add_node_front(struct LinkedList **head_ref, int data)
{
/* 1. allocate node */
struct LinkedList *new_node = malloc(sizeof(struct LinkedList));
/* 2. put in the data */
new_node->a = data;
/* 3. Make next of new node as head */
new_node->next = (*head_ref);
/* 4. move the head to point to the new node */
(*head_ref) = new_node;
}