2014-11-08 61 views
0

我想打印一個我在C中創建的鏈表,但打印順序錯誤,我不明白爲什麼。我正確地分配指針。有人可以幫我嗎?這裏是我的代碼:以正確的順序打印一個鏈表

struct list_el { 
    int val; 
    struct list_el * next; 
}; 

typedef struct list_el item; 

void main() { 
    item *curr, *head; 
    int value; 
    head = NULL; 

    scanf("%d", &value); 

    while (value != 0){ 
     scanf("%d", &value); 
     curr = (item *)malloc(sizeof(item)); 
     curr->val = value; 
     curr->next = head; 
     head = curr; 
} 
    curr = head; 

    while (curr) { 
     printf("%d\n", curr->val); 
     curr=curr->next; 
    } 
    return 0; 
} 
+0

'的scanf( 「%d」,&值);'在while循環移動到環路終端。也改爲'int main()' – BLUEPIXY 2014-11-08 20:16:11

+0

它現在沒有打印任何東西;/ – 2014-11-08 20:19:10

回答

1
scanf("%d", &value); 

while (value != 0){ 
    curr = (item *)malloc(sizeof(item)); 
    curr->val = value; 
    curr->next = head; 
    head = curr; 
    scanf("%d", &value); 
} 
+0

這些值仍然以相反的順序打印。我輸入的值例如16 14 12和0並打印12 14 16 ... – 2014-11-08 20:25:17

+1

@TomisAristidou這是因爲您正在以相反的順序連接鏈接。輸入的值連接到'head'的前面。 – BLUEPIXY 2014-11-08 20:26:26

+0

我應該改變什麼?我在鏈接列表noob ..;/ – 2014-11-08 20:32:39

1

如果您想要列表在同一順序輸入,則需要追加到列表的末尾(尾)。

int main() { 
    item *curr, *head, *tail; 
    int value; 
    head = NULL; 

    scanf("%d", &value); 

    while (value != 0) { 
     curr = (item *)malloc(sizeof(item)); 
     curr->val = value; 
     curr->next = NULL; 
     if (head == NULL) { 
      head = tail = curr; 
     } else { 
      tail->next = curr; 
      tail = curr; 
     } 
     scanf("%d", &value); 
    } 

    ... 
} 
+0

它的工作非常感謝 – 2014-11-08 20:36:25

+0

@BLUEPIXY謝謝,這就是我得到的剪切和粘貼。 – ryanpattison 2014-11-08 20:53:04

0

請嘗試以下操作。在列表中創建一個虛擬節點,以避免明確處理角落案例(空列表等)。

int main() { 
    item *curr, *head; 
    int value=-1; 
    head = (item *)malloc(sizeof(item)); 
    curr = head; 

    while (value != 0){ 
     scanf("%d", &value); 
     curr->val = value; 
     curr->next = (item *)malloc(sizeof(item)); 
     curr = curr->next; 
    } 
    curr = head; 

    while (curr->next) { 
     printf("%d\n", curr->val); 
     curr=curr->next; 
    } 
    return 0; 
} 

給出

$ ./a.out 
1 
2 
3 
4 
5 
0 
1 
2 
3 
4 
5 
0 
+0

'curr-> next'應該在第一個while循環後立即設置爲NULL。 – ryanpattison 2014-11-08 20:41:15