2013-03-26 130 views
2

我寫了這個函數來創建新節點。卡住鏈表練習

當我只添加一個節點時,程序可以正常工作,但是如果我添加第二個節點,我會遇到分段錯誤,所以問題顯然在於函數「add_node()」的「else」部分,但我可以'弄明白了。

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

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

node *start = NULL; 
node *current; 

void add_node(char *cityname) { 
    node *y = malloc(sizeof(node)); 
    y->city = cityname; 
    y->next = NULL; 
    current = start; 

    if(start == NULL) { 
     start = y; 
    } else { 
     while (current != NULL) { 
      current = current->next; 
     } 
     current->next = y; 
    } 
} 

int main() { 
    add_node("Paris"); 
    add_node("London"); 

    current = start; 

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

回答

3

您有運行,直到current是NULL循環......然後設置current->nexty,但current必然是NULL。

一個簡單的方法來解決它是將循環改爲

while (current->next != NULL){ 

我還會注意到,你應該避免全局。 current應該是一個局部變量,start應該是一個參數...我只是將它稱爲list,因爲這就是它所代表的。 add_node應該返回list的(可能是新的)值。

2

這裏:

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

    current->next = y; 

什麼時候while停止?當current變成null。然後current->next引發分段錯誤。

你必須停止一個短缺NULL。將current->nextNULL進行比較,而不是current,因此在循環退出時,您仍然指向一個節點。

0

這個循環:

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

將移動throught電流,直到current == NULL。一旦發生這樣的行:

current->next = y; 

會試圖推定NULL,這當然會導致seg故障。你只是想:

while(!current && current->next != NULL) 

技術上只需要while(current->next != NULL)因爲你start做檢查,但IMO這是很好的做法來檢查指針這樣的NULL你尊重它。

+0

'current = y'將會覆蓋迭代變量,而不會將該項目附加到鏈接列表 – slezica 2013-03-26 18:54:05

+0

「在您尊重它之前檢查指針爲NULL是一種很好的做法。」 - 它只是*被*檢查。這些冗餘檢查實際上是非常糟糕的做法......它們使得代碼難以閱讀和遵循並破壞其抽象性質......在這裏,有一個循環來查找空'下一個'指針,所以兩個空檢查循環條件不合邏輯。空列表的警衛看起來像是「if(current!= NULL){while(current-> next!= NULL){...}}'但那個守衛已經在那裏了。 – 2013-03-26 23:30:36