2014-10-31 2 views
1

Я новичок в 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)); 

Они оба компилироваться.

спасибо.

+0

Используйте либо 'emptyList-> next', либо' (* emptyList) .next' (желательно первый - именно поэтому был изобретен оператор '' '>' '). Вы должны использовать '(* ptr_to_ptr) -> next', если переменная была указателем на указатель. –

+0

Что касается вызовов 'malloc()', то первый не выделяет достаточно места, а второй делает. Вы можете сделать лучше с 'LinkList * emptyList = malloc (sizeof (* emptyList));' который всегда корректен. –

+0

Джонатан, благодарю вас за ответ. Это решает мою проблему. –

ответ

-2

sizeof (Something *) дает вам обычно 4 байта (в качестве адреса), который является размером адреса.

sizeOf (что-то) дает размер вашего объекта - в вашем случае это может быть 4 байта для головы (sizeof (int)) и 4 байта для указателя (sizeof (address)) - принимая много о вашем окружающая среда здесь).

Обратите внимание, что, как указал Джонатан Лефлер, размер адреса зависит от архитектуры ОС. Его можно вычислить (количество бит/8 (размер байта)). Таким образом, на 32 бита адреса имеют длину 4 байта и 64 бит, они могут иметь длину 8 байтов.

когда вы говорите (* SomeObject), что означает указываемый, вы ссылаетесь самому объекту, так что вы можете использовать (* SomeObject) .Property Свойства
, когда у вас есть указатель на объекте. вы можете использовать свойство arrow SomeObject->. который получит ссылку SomeObject и найдет на нем «свойство».

+1

4 байта - это размер указателя на 32-битной системе; размер указателя обычно составляет 8 байтов в 64-битной системе. –

Смежные вопросы