C语言队列链表出现无限循环打印问题求助
问题根源与解决方案
你的代码陷入无限循环的核心原因是复用了同一块内存空间:在initFromText()函数中,Patient* newP和Temperature* newT的内存分配语句写在了while循环外面,导致整个循环过程中始终修改同一个内存块的数据,并且反复将同一个指针传入enqueue()函数。
具体逻辑错误
- 第一次循环:分配内存块X,写入第一个病人数据,
first指向X,X的next设为NULL。 - 第二次循环:直接覆盖内存块X的内容为第二个病人数据,调用
enqueue()时,程序找到链表最后一个节点(就是X,因为X->next是NULL),然后将X->next指向newP——也就是X自己。 - 此时链表形成环结构,
current = current->next永远指向X,打印时陷入无限循环。
修改后的代码
只需要将内存分配语句移到while循环内部,每次循环创建新的节点:
void initFromText(Patient **first){ FILE *file = fopen("data.txt", "r"); if (file == NULL) return; char line[MAX_LINE_LENGTH]; while(fgets(line, MAX_LINE_LENGTH, file)){ // 每次循环分配新的Patient和Temperature节点 Patient *newP = (Patient*)malloc(sizeof(Patient)); Temperature *newT = (Temperature*)malloc(sizeof(Temperature)); char *name = strtok(line, ","); strcpy(newP->name, name); newP->age = atoi(strtok(NULL, ",")); newP->room = atoi(strtok(NULL, ",")); newT->temperature = atof(strtok(NULL, ",")); newT->next = NULL; newP->firstTemp = newT; newP->next = NULL; enqueue(first, newP); } fclose(file); }
额外注意事项
- 记得添加内存释放逻辑,避免内存泄漏。可以编写
freePatients()函数遍历链表,逐个释放Patient和对应的Temperature节点。 - 你之前排查时的
printf("\nSiguiente: %s", newP->next->name);语句存在未定义行为,因为newP->next是NULL,直接访问NULL的成员会导致崩溃或乱码。
内容的提问来源于stack exchange,提问作者vis_hoo
相关产品推荐
相关产品推荐

