有兩個問題與您的代碼:
- ,直到它變成
NULL
的temp
指針被推到列表的末尾,那時就爲時已晚將新指針存儲到其next
成員,並嘗試調用未定義的行爲(您的系統上的Segmentation fault
)。
- 如果列表爲空,即使您在
temp->next == NULL
時停止循環,也不能以此方式存儲新項目。
也希望避免使用C++關鍵字來命名C代碼中的變量,因爲如果需要這樣做,將會更難將代碼遷移到C++。
此外,測試malloc
失敗並返回指向新節點的指針或NULL
失敗時會更加正確。
這裏是一個修正版本:
node *insert(node **head, int x) {
node *new_node = malloc(sizeof(node));
if (new_node != NULL) {
new_node->data = x;
new_node->next = NULL;
node *temp = *head;
if (temp == NULL) {
*head = new_node;
} else {
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = new_node;
}
}
return new_node;
}
您也可以使用指針的指針來遍歷列表:它是較爲複雜的,但更短的,你只有一個測試,以找出位置存儲new
指針:
node *insert(node **head, int x) {
node *new_node = malloc(sizeof(node));
if (new_node != NULL) {
new_node->data = x;
new_node->next = NULL;
node **np = head;
while (*np) {
np = &(*np)->next;
}
*np = new_node;
}
return new_node;
}
歡迎來到Stack Overflow。一般來說,「停止工作」並不足以說明問題。它會進入無限循環嗎?它是否會因分段錯誤或同等程序而崩潰?或者是別的什麼?其中一個要考慮的問題是「調試器顯示了什麼?」另一個是「當打印語句添加到代碼中時發生了什麼?」這些技巧中的一個或另一個是確定出現問題的必要步驟。請考慮創建一個MCVE([如何創建一個最小,完整和可驗證的示例?](http://stackoverflow.com/help/mcve)) –