You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言链表开发:Donor链表所有id均为最后值问题排查

问题根源

你怀疑的链表插入代码是完全正确的,问题出在Donor节点的id赋值逻辑,以及打印函数的定义错误:

  • 首先,你在while循环外定义了栈内存的二维数组newString[10][10],整个循环过程中所有分割操作都复用同一块内存空间,每次循环都会覆盖newString里的旧内容。你直接把node->id = newString[0],相当于所有Donor节点的id指针都指向了同一个栈内存地址,等循环结束后这块地址里存的是最后一行的id值5,所以遍历打印的时候所有节点输出的都是5。
  • 其次你的print函数定义存在类型错误:函数接收的是Stored*类型参数,内部还访问了不存在的id属性(Stored结构体的成员是string不是id),你后面传入Donor*类型的head1调用属于非法操作,会引发未定义行为。

修复方案

  1. 给每个Donor节点的id分配独立的堆内存,替换直接赋值栈地址的逻辑:
    把
node-> id = newString[0];

改为

node->id = strdup(newString[0]);

如果要兼容没有strdup的环境,也可以手动分配内存后复制:

node->id = malloc(strlen(newString[0]) + 1);
strcpy(node->id, newString[0]);
  1. 单独实现Donor链表的打印函数,不要和Stored的打印逻辑混用:
void print_donor(Donor* head){
    Donor* current_node = head;
    while(current_node!= NULL){
        printf("%s\n", current_node->id);
        current_node = current_node->link;
    }
}

后续打印Donor链表时调用print_donor(head1)即可。

  1. 补充内存释放逻辑:程序结束前遍历两个链表,分别释放每个节点的字符串成员和结构体本身,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Marvin Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:15:08