2017-02-11 16 views
1

Я начинаю изучать C и пытаюсь реализовать связанные списки. По какой-то причине мой код не работает исправление. Мои addtail и printlist функции работают нормально, но мой addhead нет.Я реализую связанные списки в C, и моя функция addhead работает некорректно. Что не так?

Я не могу понять, что не так. Вот код, который я написал до сих пор:

#include <stdio.h> 

int main() 
{ 

    typedef struct temp_node{ 
     int data; 
     struct temp_node * next; 
    } node; 

    void addtail(node * head, int taildata){ 
     node * tail = malloc(sizeof(node)); 
     tail->data = taildata; 
     tail->next = NULL; 

     node * current = head; 

     while(current->next != NULL){ 
      current = current->next; 
     } 

     current->next = tail; 
    } 

    void addhead(node ** head, int headdata){ 
     node * newhead = malloc(sizeof(node)); 
     newhead->data = headdata; 
     newhead->next = *head; 
     *head = newhead; 
    } 

    void printlist(node * head){ 
     node * current = head; 

     while(current != NULL){ 
      printf("%d\n", current->data); 
      current = current->next; 
     } 
    } 

    node * head = malloc(sizeof(node)); 
    head->data = 0; 
    head->next = NULL; 

    addtail(head, 1); 
    addtail(head, 2); 
    addhead(head, 5); 

    printlist(head); 

    return 0; 
} 

Когда я запускаю его (на https://www.tutorialspoint.com/compile_c_online.php) Я получаю следующий вывод:

6299760 
1 
2 

Почему это не меняя голову списка правильно?

+2

У вас есть функции, определенные в рамках другой функции ('main'). Это недопустимо C. – melpomene

+3

'addhead (head, 5);' -> 'addhead (& head, 5);' Также вам нужно '#include ' – BLUEPIXY

+3

Вы игнорируете ошибки типа из своего компилятора? – melpomene

ответ

0

У меня теперь есть еще один: Почему в addtail я прошел список нормально, и он работал нормально, тогда как с addhead я должен передать его по ссылке?

Оба способа работают нормально. Либо вы передаете указатель на узел, как это:

addhead(node * head, int headdata) 

и назвать его так: addhead(head,5)

Или передать указатель на указатель на узел (2D указатель):

addhead(node ** head, int headdata) 

и назовите его, передав ссылку на указатель на голову (то есть двумерный указатель) следующим образом:

addhead(&head,5) 

Надеюсь, это поможет!

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

  • Нет связанных вопросов^_^