坚持链表练习

时间:2013-03-26 18:49:05

标签: c

我写了这个创建新节点的函数。

当我只添加一个节点时,该程序可以工作,但是如果我添加第二个节点,我会得到一个分段错误,所以很明显问题出在函数“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 个答案:

答案 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->nextNULL,而不是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。