Я новичок в c и сегодня я пытаюсь реализовать связанный список в c.реализация связанного списка в c
У меня есть только одна функция вызова createEmptyList()
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
typedef struct Node
{
int head;
struct Node *next;
}LinkList;
LinkList* createEmptyLinkList(){
LinkList* emptyList = malloc(sizeof(LinkList*));
(*emptyList)->head = 0;
(*emptyList)->next = NULL;
return emptyList;
}
Я пытаюсь использовать указатель для инициализации первого узла. Однако, когда я компиляции, я получаю следующее сообщение об ошибке:
linkedListImple.c:115:14: error: member reference type 'LinkList'
(aka 'struct Node') is not a pointer; maybe you meant to use '.'?
(*emptyList)->head = 0;
~~~~~~~~~~~~^~
.
linkedListImple.c:115:21: error: expression is not assignable
(*emptyList)->head = 0;
~~~~~~~~~~~~~~~~~~^
linkedListImple.c:116:14: error: member reference type 'LinkList'
(aka 'struct Node') is not a pointer; maybe you meant to use '.'?
(*emptyList)->next = NULL;
~~~~~~~~~~~~^~
.
linkedListImple.c:116:21: error: expression is not assignable
(*emptyList)->next = NULL;
~~~~~~~~~~~~~~~~~~^
Я действительно путают, хотя я думаю, что я сделал очень простую ошибку здесь.
Не пустЛист указатель здесь? так как я объявляю его как LinkList * emptyList. Поэтому, если emptyList является указателем, то * emptyList ссылается на фактический узел структуры.
, когда я удаляю * знак в следующих строках, ошибка исчезает. он становится:
(emptyList)->head = 0;
(emptyList)->next = NULL;
Также я не совсем понимаю: какая разница между
LinkList* emptyList = malloc(sizeof(LinkList*));
и
LinkList* emptyList = malloc(sizeof(LinkList));
Они оба компилироваться.
спасибо.
Используйте либо 'emptyList-> next', либо' (* emptyList) .next' (желательно первый - именно поэтому был изобретен оператор '' '>' '). Вы должны использовать '(* ptr_to_ptr) -> next', если переменная была указателем на указатель. –
Что касается вызовов 'malloc()', то первый не выделяет достаточно места, а второй делает. Вы можете сделать лучше с 'LinkList * emptyList = malloc (sizeof (* emptyList));' который всегда корректен. –
Джонатан, благодарю вас за ответ. Это решает мою проблему. –