Для начала это объявление структуры (если даже не учитывать забытую точку с запятой после закрывающей скобки)
struct node {
int data;
node* next;
}
является неправильным.
struct node
и node
являются два разных спецификатора типа. Структура должна быть объявлена как
struct node {
int data;
struct node* next;
};
Таким образом, односвязный список состоит из узлов одного типа, и каждый узел указывает на другой следующий узел.
Голова или начало список указывается одним указателем, который обозначает начало списка и изначально устанавливается в NULL, потому что изначально список пуст.
int main( void ){
node* root = NULL;
}
Так, если каждый узел содержит ссылку (указатель) на следующий узел, тогда нам нужно иметь начальную ссылку (указатель) на потенциально первый узел списка, который будет добавлен или вставлен перед списком.
Если эта начальная ссылка (указатель) не равна NULL, тогда он означает, что список имеет по крайней мере один фактический узел, и ссылка указывает на первый узел списка.
Обычно этот узел включен в структуру, которая обозначает список. Например,
struct SinglyLinkedList
{
struct node *head;
};
и в основном объект структуры объявляется как
int main( void )
{
SinglyLinkedList list = { NULL );
//…
}
Пользователь списка не должен иметь дело непосредственно с объектами узла типа структуры.
Например, функция, которая выдвигает новый узел, может выглядеть как
int push_front( struct SinglyLinkedList *list, int data )
{
struct node *new_node = malloc( sizeof( struct node ) );
int success = new_node != NULL;
if ( success )
{
new_node->data = data;
new_node->next = list->head;
list->head = new_node;
}
return success;
}
Что-то вроде
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node* next;
};
struct SinglyLinkedList
{
struct node *head;
};
int push_front( struct SinglyLinkedList *list, int data )
{
struct node *new_node = malloc( sizeof( struct node ) );
int success = new_node != NULL;
if ( success )
{
new_node->data = data;
new_node->next = list->head;
list->head = new_node;
}
return success;
}
int main(void)
{
struct SinglyLinkedList list = { NULL };
const int N = 10;
for ( int i = 0; i < N; i++ )
{
push_front( &list, i );
}
//…
return 0;
}