链接列表添加节点更改所有节点值而不是一个

时间:2012-04-16 08:26:26

标签: c linked-list

好吧,我现在已经工作了好几个小时了,无法弄清楚我的问题。我有一个双链表,当我尝试添加一个新节点时,它将更改链表中的所有值。

现在这就是我所拥有的:

void createSub(sibs *root, char *name, int size) {
    if (root->subSibs == NULL) {
        root->subSibs = (sibs *)malloc(sizeof(sibs));
        root->subSibs->name = name;
        root->subSibs->time_stamp = createTimeStamp();
        root->subSibs->nextSib = NULL;
    }

    sibs *temp = root->subSibs;
    if (temp != NULL) {
        while(temp->nextSib != NULL)
            temp = temp->nextSib;
    }
    sibs *t = (sibs *)malloc(sizeof(sibs));

    t->name = name;
    t->time_stamp = createTimeStamp();
    t->nextSib = NULL;

    if(temp != NULL)
        temp->nextSib = t;

    printf("root->subSibs->name = %s\n", root->subSibs->name);
    (root->numSub)++;
}
考虑到我已经改变了一百万次,这可能并不完美。有人能告诉我这里我做错了什么吗?

root是我正在使用的根节点,subSibs是指向链接列表的指针。我正在做的是为root->subSibs指向的链表中的每个节点添加名称和时间戳。

我得到的是:

createSub(root, name1, size);

打印:

root->subSibs1: name1;

createSub(root, name2, size);

打印:

root->subSibs1: name2;
root->subSibs2: name2;

等...

这可能是一些非常愚蠢的错误,但任何帮助都会令人惊讶。我已经尝试了几个小时,只需要有人告诉我它为什么会改变这些名字。

此外,如果我strcpy(root->subSibsi->name, name); for i = 0-5; root->subSibs1->name打印垃圾,然后root->subSibs2->name打印正确的名称,然后root->subSibs3->name打印垃圾(与subSibs1->name相同)等等......

3 个答案:

答案 0 :(得分:3)

t->name = name;

您正在复制指针。相反,您可能想要复制内存:

t->name = strdup(name);

或者:

t->name = malloc(strlen(name) + 1);
strcpy(t->name, name);

答案 1 :(得分:1)

没有更多信息(比如你如何调用函数)我猜你有一个缓冲区(可能是一个char数组),并且每次调用createSubs时都会将地址传递给同一个缓冲区。这将使您创建的每个节点指向同一个缓冲区,该缓冲区将始终包含输入的最后一个字符串。

答案 2 :(得分:1)

在您的节点中,名称为char * 。换句话说,它可以指向一些任意的内存位置。首先它有一些垃圾值,所以它从程序员的角度来看都没有任何意义,也不能用来存储价值 - 这就是你所做的。

现在,如果我们分配一部分内存,大到足以存储由参数 char * name 指向的字符串,我们可以使您的节点名称指向它。完成后,您可以将参数名称* 复制到节点名称*