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

C语言用链表实现队列时仅无限重复最后一个节点问题求助

问题原因
  • 仅分配了1次advisee结构体内存:malloc操作写在了while循环外部,整个程序运行过程中只有一块student对应的内存空间。每次循环读取的新学生信息都会覆盖这块内存的原有内容,而每次入队的都是同一个内存地址的指针,最终队列里所有节点都指向同一块内存,自然只会显示最后一次写入的内容。
  • feof使用逻辑错误:feof是在文件读取操作失败后才会被置为真,当前写法会导致最后一轮循环读取到无效数据,多加入一个错误的节点。
  • 名字读取存在格式问题:fscanf读取完学号后,输入缓冲区中还残留学号和名字之间的空格,fgets会直接把这个前导空格读到name字段中,导致名字格式异常。
修复方案

把内存分配逻辑移到循环内部,改用读取函数的返回值作为循环终止条件,同时修正名字读取的逻辑,修复后代码如下:

int Start(advisee** front, advisee** rear) {
  advisee* student;
  FILE* infp;
  infp = fopen("ToServe.txt", "r");
  if(infp == NULL) {
    return 0;
  }
  while(1) {
    // 每次循环新分配一块内存存储当前学生信息
    student = (advisee*)malloc(sizeof(advisee));
    // 直接读取三个字段,自动跳过字段间的空白符,名字读至换行符结束
    int read_cnt = fscanf(infp, "%d %d %[^\n]", &student->ticket, &student->ID, student->name);
    if(read_cnt != 3) { // 没有读到3个有效字段说明文件读取完毕
      free(student); // 释放本次循环提前分配的内存
      break;
    }
    student->next = NULL;
    enqueue(front, rear, student);
  }
  fclose(infp);
  return 1;
}
void enqueue(advisee** front, advisee** rear, advisee* ToAdd) {
    if (*front == NULL)
      *front = ToAdd;
    else
      (*rear)->next = ToAdd;
    *rear = ToAdd;
}

内容的提问来源于stack exchange,提问作者Mohammad Harouak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:24:02