2013-06-19 228 views
0

我想了解鏈接列表的代碼。我明白他們是如何工作的。 我在看一些代碼做動態內存和鏈表,我在這裏簡單的:C - 鏈接列表

#include <stdio.h> 
#include <stdlib.h> 

typedef struct node { 
    char *word; 
    struct node *next; 
} node; 

void display_word(node *start) { 
    node *start_node = start; 
    puts(""); 
    for(; start_node != NULL; start_node = start_node->next) { 
     printf("%s", start_node->word); 
    } 
} 

node* create_node(char *input) { 
    node *n = malloc(sizeof(node));; 
    n->word = strdup(input); 
    n->next = NULL; 
    return n; 
} 

int main() { 
    node *start_node = NULL; 
    node *n = NULL; 
    node *next_node = NULL; 
    char word_holder[20]; 
    for(; fgets(word_holder,80,stdin) != NULL; n = next_node) { 
     next_node = create_node(word_holder); 
     if(start_node == NULL) 
      start_node = next_node; 
    if(n != NULL) 
     n->next = next_node; 
    } 
    display_word(start); 
} 

所以程序創建用戶輸入每個字的鏈接列表,然後將其打印出來。 我不明白的是在main()函數中,每次將next_node分配給新節點以創建新節點,但start_node指向next_node,因此它會指向next_node每次創建的每個新節點?那麼如何保持清單呢?我們每次都不應該失去舊節點嗎?

有人可以解釋一下。

+0

OFF TOPIC:你的名字是「miniJavaLearner」,你在C編碼?呵呵 :) –

回答

2
  1. 當第一個節點被創建時,指向它的指針被保存在start中。

  2. 在創建後續節點,它們在端列表的加入,所以start仍然指向到所述第一節點,並通過它,該列表的其餘部分。

步驟通過與調試程序的代碼,或者出去鉛筆和紙,畫發生了什麼事,你在你的大腦步,你會看到這一切又是如何放在一起。

1

我希望這可以回答你的問題 - 每次你更新「下一個」時,你都將它設置爲另一個新節點。每個節點都有自己的「下一個」導向下一個節點,所以你不會因爲這樣做而失去任何東西。我沒有真正測試你的代碼,但是因爲「開始」總是指向第一個節點,所以你不會丟失任何節點。如果您想了解更多關於它的工作方式,調試器應該會有所幫助!

2

創建第一個節點時,指向它的指針將保存在開始位置。

在循環的每次迭代之後,將「n」設置爲剛剛創建的節點,因爲for循環的最後一部分(; n = next)會在循環的每次迭代後執行。所以中間循環執行「n」將始終指向前一個節點。因此,語句n> next = next將前一個節點的「下一個」指針設置爲新節點。

因此,在循環的第二次迭代中,n = start,並且start-> next設置爲剛剛創建的節點的「next」。