在链表中添加节点的不同方式

时间:2016-02-19 09:14:58

标签: c linked-list

这个简单的代码(向链表添加元素并打印它)工作正常

#include <stdio.h>
struct node{
    int item;
    struct node* next;
};

void print_node (struct node* n){
    while (n!= NULL){
        printf("%d ", (*n).item);
        n = n->next;
    }
    printf("\n");
}

void append_node(struct node *list, struct node *n){

    while(list->next != NULL)
        list = list->next;

    list->next = n;

}

int main(){
    struct node n1, n2;
    n1.item = 1;
    n1.next = NULL;

    n2.item = 2;
    n2.next = NULL;

    print_node(&n1);
    print_node(&n2);

    append_node(&n1,&n2);

    print_node(&n1);

    printf("done\n");
    return 0;
}

如果我将append_node定义为以下

void append_node(struct node *list, struct node n){

    while(list->next != NULL)
        list = list->next;

    list->next = &n;

}

并在main中相应地调用它(即append_node(&n1, n2))运行程序时出现分段错误。我不明白为什么:)

1 个答案:

答案 0 :(得分:1)

当您致电append_node(struct node *list, struct node n)时,参数n将复制到函数上下文中。

当函数离开时,将释放上下文,并且数据的副本n将丢失。

如果您在将append_node(struct node *list, struct node n)(使用n)复制到链接列表之前,可以使用您的函数malloc

修改

这可能会对您有所帮助:What's the difference between passing by reference vs. passing by value?