Похоже, вы не знакомы с typedef в c.
typedef - зарезервированное ключевое слово в языках программирования C и C ++. Он используется для создания псевдонима для другого типа данных. Как таковой, он часто используется для упрощения синтаксиса объявления сложных структур данных, состоящих из типов struct и union, но столь же распространен в предоставлении конкретных описательных имен типов для целых чисел. типы данных различной длины.
Теперь посмотрите на это утверждение:
typedef struct node * llist;
Это означает, что llist
является псевдонимом для типа struct node *
.
В этом утверждении
llist *new_list = (llist *)malloc(sizeof (llist));
тип new_list
равен llist *
, что является ничем иным, как struct node **
.
Итак, первое выделение памяти для new_list
предназначено для указателя на указатель на struct node
, а второе выделение для для указателя на struct node
.
IMO, код, опубликованный OP, сбивает с толку по двум причинам:
- введите указатель на структуру
- Две операции создания списка и добавления узла в этот список объединены в одну функцию.
Более читаемый код будет выглядеть примерно так:
struct node {
void *data;
struct node *next;
};
typedef struct node NODE;
struct llist {
NODE *head;
};
typedef struct llist LLIST;
LLIST *create_list() {
LLIST *llist = malloc(sizeof(LLIST));
if (llist == NULL)
exit(EXIT_FAILURE);
llist->head = NULL;
return llist;
}
NODE *create_ll_node(void *data) {
NODE *node = malloc(sizeof(NODE));
if (node == NULL)
exit(EXIT_FAILURE);
node->data = data;
node->next = NULL;
return node;
}
// The add function for inserting node at the start of list
// Parameter: pointer to LLIST
// data to be insert in node
void add_list_head(LLIST *llist, void *data) {
NODE *node = create_ll_node(data);
if (llist->head != NULL) {
node->next = llist->head;
}
llist->head = node;
}
//driver function
int main() {
LLIST *llist = create_list();
.....
.....
add_list_head(llist, <data>);
add_list_head(llist, <data>);
.....
.....