链表头指针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
相关产品推荐
相关产品推荐

