我写了这个创建新节点的函数。
当我只添加一个节点时,该程序可以工作,但是如果我添加第二个节点,我会得到一个分段错误,所以很明显问题出在函数“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;
}
}
答案 0 :(得分:3)
你有一个循环,直到current
为NULL ...然后你将current->next
设置为y
,但current
必须为NULL。
修复它的一种简单方法是将循环更改为
while (current->next != NULL){
我还要注意你应该避免使用全局变量。 current
应该是一个局部变量,start
应该是一个参数......我只是称之为list
,因为它代表了它。 add_node
应返回list
的(可能是新的)值。
答案 1 :(得分:2)
下面:
while (current != NULL) {
current = current->next;
}
current->next = y;
while
什么时候停止?当current
变为null
时。然后current->next
引发了细分错误。
你必须停在NULL
之前。比较current->next
到NULL
,而不是current
,所以当循环退出时你仍指向一个节点。
答案 2 :(得分:0)
这个循环:
while (current != NULL){
current = current->next;
}
将一直移动到current == NULL
。一旦发生这一行:
current->next = y;
会尝试推断NULL,这当然会导致seg错误。你只是想要:
while(!current && current->next != NULL)
从技术上讲,你只需要while(current->next != NULL)
,因为你检查了start
,但是在你尊重它之前,最好先检查指针是否为NULL。