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
相关产品推荐
相关产品推荐

