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

链表头指针current被新值覆盖,仅能打印最后插入元素的原因

问题原因分析

核心问题在于字符串指针的错误赋值,具体如下:

  • 代码中temps、tempt、tempn、tempi应该是指向同一块内存空间的字符数组或指针(比如函数内的局部数组),每次循环调用fscanf时,新读取的数据都会覆盖这块内存里的旧内容。
  • 给链表节点成员赋值时,你直接用指针赋值:new->visitor.SrNo=temps;,这会让所有链表节点的SrNo、ticketNo等成员都指向同一块内存地址。后续循环覆盖这块内存后,所有节点的这些字段自然都会显示最后一次读取的内容。
  • 打印时仅能看到最后一个元素,本质也是因为所有节点的字符串字段指向同一块内存,遍历链表时每个节点展示的都是最后一次写入的数据,看起来就像只有最后一个元素有效。
修复思路
  • 不要直接赋值字符串指针,而是使用strcpy(或strdup)将字符串内容复制到节点成员中。
    • 如果visitor结构体里的字段是指针,需要先给它们分配足够内存(比如用malloc分配字符串长度+1的空间),再用strcpy复制内容;
    • 如果是固定大小的字符数组,直接用strcpy即可。
  • 示例修复(假设visitor的字段是指针):
// 为每个字符串成员分配内存并复制内容
new->visitor.SrNo = malloc(strlen(temps) + 1);
strcpy(new->visitor.SrNo, temps);
// ticketNo、Name、ID字段做同样处理

内容的提问来源于stack exchange,提问作者Leon Loo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:40:41