2013-02-19 3 views
0

У меня есть функция следующим образомПочему эта функция связанного списка печати не работает?

void printLinkedList(struct node *head) { 

    printf("%d-->", head->data); 

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

Я хотел бы напечатать содержание связанного списка строится следующим образом:

for (int i = 0; i < 10; i++) { 
    head->data = i+1; 
    head->ptr = malloc(sizeof(struct node)); 
    head = head->ptr; 
} 

Так в идеале это должно дать мне что-то вроде:

1-->2-->3-->4-->...-->10-->NULL 

Если все верно, valgrind дает мне ошибки в памяти. Пожалуйста, скажите мне, что я делаю неправильно.

+0

В связанном списке головной узел (первый узел) необходимо сохранить таким образом, чтобы список можно разобрать. В вашем коде ваша переменная с именем head изменяется для каждого добавления и указывает на последний узел. Также вы не назначаете NULL последнему узлу – 999k

ответ

1

проверьте это.

struct node *temp, *head= NULL, *last = NULL; 
    for (int i = 0; i < 10; i++) { 
     temp = malloc(sizeof(struct node)); 
     temp->data = i+1; 
     temp->ptr = NULL; 
     if (head == NULL) 
      head = temp; 
     if (last != NULL) 
      last->ptr = temp; 
     last = temp; 
    } 
printLinkedList(head); 
+0

hmm не знаете почему, но ваш код дает мне ошибку seg. Я изменил свой код, учитывая ваш комментарий, и теперь он работает! :) Спасибо! – Enzo

+0

его потому что temp не объявлен для первого цикла внутри цикла – 999k

+0

Хорошо сделано - вы исправили утечку памяти перед тем, как я получил комментарий. Этот код выполняется чисто под 'valgrind' (когда я добавляю вызов' free_list (head); 'после вызова' printLinkedList() ', где' free_list() 'определяется как:' void free_list (struct node * head) { while (head! = 0) {struct node * next = head-> ptr; free (head), head = next;}} '). –

1

я пересмотрел ответ Toms немного:

struct node *head = NULL, **temp = &head; 
for (int i = 0; i < 10; i++) { 
    *temp = malloc(sizeof(struct node)); 
    (*temp)->data = i+1; 
    (*temp)->ptr = NULL; 
    temp = &(*temp)->ptr; 
} 
printLinkedList(head); 

код производит оригинальная неисправность сегм, потому что температура не malloced должным образом.

+0

где привязка temp-> ptr имеет значение NULL – 999k

+0

Я перемещаю 'temp = temp-> ptr' в конец цикла, и он будет выделен в следующем прогоне. – cogitovita

+0

в следующем запуске в первом утверждении, что temp перезаписан. – 999k

0

Если вызвать функцию печати без построения связного списка, он будет показывать ошибку, поэтому изменить функцию печати следующим образом:

void printLinkedList(struct node *head) 
{ 
    while(head != NULL) 
    { 
     printf("%d-->", head->data); 
     head = head->ptr; 
    } 
    printf("NULL\n"); 
} 
+0

Правильно только потому, что голова сама по себе является указателем на Связанный список, поэтому мы можем проверить, что голова равна нулю –

0

здесь пересмотренный код - ваша конструкция была неисправна.

typedef struct _node { 
    int data; 
    struct _node *ptr; 
} NODE, *PNODE; 

PNODE head; 

int main (int argc, char * argv[]) 
{ 

    head = (PNODE) malloc(sizeof(NODE)); 
    PNODE node = head; 

    int i = 0; 
    node->data = ++i; 
    node->ptr = NULL; 

    for (;i < 10;) { 
     PNODE tmp = (PNODE) malloc(sizeof(NODE)); 
     tmp->data = ++i; 
     tmp->ptr = NULL; 

     node->ptr = tmp; 
     node =tmp; 
    } 

    printLinkedList(head); 

    freeLinkedList(head); 

    return 0; 

}