C - 链表添加节点更改所有节点值,而不仅仅是一个



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

现在这就是我所拥有的:

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 = %sn", 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相同)等等......

t->name = name;

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

t->name = strdup(name);

或:

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新