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

C语言队列链表出现无限循环打印问题求助

问题根源与解决方案

你的代码陷入无限循环的核心原因是复用了同一块内存空间:在initFromText()函数中,Patient* newP和Temperature* newT的内存分配语句写在了while循环外面,导致整个循环过程中始终修改同一个内存块的数据,并且反复将同一个指针传入enqueue()函数。

具体逻辑错误

  1. 第一次循环:分配内存块X,写入第一个病人数据,first指向X,X的next设为NULL。
  2. 第二次循环:直接覆盖内存块X的内容为第二个病人数据,调用enqueue()时,程序找到链表最后一个节点(就是X,因为X->next是NULL),然后将X->next指向newP——也就是X自己。
  3. 此时链表形成环结构,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:13:10