gpt4 book ai didi

c - 为什么向链表添加新值会覆盖现有内容?

转载 作者:行者123 更新时间:2023-11-30 20:48:02 25 4
gpt4 key购买 nike

我正在尝试使用 for 循环将随机生成的值添加到链接列表中。当我尝试打印列表时,它具有正确的条目数,但它们都与输入的最后一项的值匹配。

这是代码。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct student {
int num;
char* name;
} student;

typedef struct container {
student* data;
struct container* next;
} container ;

container* front;
container* back;

container* createContainer(student* data) {

container* tmp = malloc(sizeof(container));

tmp->data = data;
tmp->next = NULL;

return tmp;

}

int add(student* to_add) {

printf("%d %s\n", to_add->num, to_add->name);

back->next = createContainer(to_add);
back = back->next;


return 1;
}

void printList(container* front) {

container* tmp = front;

int i;
i=0;
while (tmp != NULL) {
i++;
printf("%d:\t%d\t\t%s\n", i, tmp->data->num, tmp->data->name);
tmp = tmp->next;
}

}

int main(void) {
srand(time(NULL));

student st = {rand(), "test"};
front = createContainer(&st);
back = front;

printList(front);

int i;
for (i=0; i<12; i++) {
st.num = rand();
st.name = "test";
add(&st);
}

printList(front);

// print the third value stored in the list.
container* tmp = front->next->next;
printf("%d\t\t%s\n", tmp->data->num, tmp->data->name);

return EXIT_SUCCESS;
}

这是它的输出:

1:  25312       test
17285 test
3447 test
8299 test
14310 test
22628 test
31306 test
8682 test
31936 test
18951 test
4107 test
7910 test
20556 test
1: 20556 test
2: 20556 test
3: 20556 test
4: 20556 test
5: 20556 test
6: 20556 test
7: 20556 test
8: 20556 test
9: 20556 test
10: 20556 test
11: 20556 test
12: 20556 test
13: 20556 test
20556 test

第一行显示第一个值已正确添加。非编号行是列表中应有的值,编号行显示实际存储在列表中的值。最后一行只是打印列表中存储的第三个值,只是为了表明它(希望)不是打印函数的问题。

最佳答案

在您的所有程序中,只有一个 student 对象:

student st = {rand(), "test"};

(在main中)。

其余代码创建一个链表,其中包含指向该对象的十几个指针。当您检查列表时,您将跟随指针并打印同一对象 12 次。

(顺便说一句,添加到链接列表的行为不会覆盖内容,而是 main 中的这些行:

    st.num = rand();
st.name = "test";

在这里,您修改程序中单个student的内容。)

为了解决此问题,您需要创建多个 student 对象,每个列表元素一个。最简单的方法是让 container 直接存储 student:

typedef struct container {
student data; // not a pointer
struct container *next;
} container;

然后调整所有函数以使用此数据结构。

关于c - 为什么向链表添加新值会覆盖现有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48737100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com