2016-03-08 2 views
2

Я пытаюсь распечатать связанный список в том порядке, в котором я создал каждый узел в связанном списке. Например, он должен распечатать «0 1 2 3 4», но мой код ошибочен и ничего не распечатывает. Я думаю, что проблема лежит где-то в моей петле.Single Linked List print in order of for loop

#include <stdio.h> 
#include <stdlib.h> 
struct node 
{ 
    int data; 
    struct node *next; 
}; 

int main(void) 
{ 
    struct node *head = NULL; 
    struct node *tail = NULL; 
    struct node *current; 
    current = head; 
    int i; 
    for(i = 0; i <= 9; i++) 
    { 
     current = (struct node*)malloc(sizeof(struct node)); 
     current-> data = i; 
     current-> next = tail; 
     tail = current; 
     current = current->next; 
    } 

    current = head; 
    while(current) 
    { 
     printf("i: %d\n", current-> data); 
     current = current->next; 
    } 
} 

ответ

0

При создании вашего списка вы столкнулись с арифметикой указателя. Попробуйте это вместо:

int main(void) 
{ 
    struct node *head = NULL; 
    struct node *tail = NULL; 
    struct node *current; 
    int i; 
    for (i=0; i <= 9; i++) 
    { 
     struct node *temp = (struct node*)malloc(sizeof(struct node)); 
     temp-> data = i; 
     temp-> next = NULL; 
     if (head == NULL)   // empty list: assign the head 
     { 
      head = temp; 
      tail = temp; 
      current = head; 
     } 
     else       // non-empty list: add new node 
     { 
      current-> next = temp; 
      tail = temp; 
      current = current->next; 
     } 
    } 

    // reset to head of list and print out all data 
    current = head; 

    while (current) 
    { 
     printf("i: %d\n", current-> data); 
     current = current->next; 
    } 
} 
+0

Спасибо! Я закончил его самостоятельно, и теперь понимаю основы указателей. Моя выглядит несколько иначе, чем ваша, в том, что мой ток был разделен, и мой темп был тогда настроен на текущую, но такую ​​же основную предпосылку. –

+0

На самом деле я пробовал ваш код, вы забыли установить current-> рядом с NULL в конце инструкции else. Вам это нужно, потому что иначе, когда вы печатаете список в цикле while, он не будет знать, когда остановиться и сделать странный цикл. –

+0

@ DanielMartin На самом деле следующий указатель для каждого нового узла должен быть установлен на 'NULL' в момент создания узла. –