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

C语言链表enqueue函数异常:仅添加单个节点且覆盖前序节点求助

问题分析与修复

你的enqueue_w函数存在两个核心逻辑错误,导致多次入队时节点被覆盖或丢失:

错误1:分支逻辑不互斥

第一个if (w_queue->front == NULL)初始化队列后,第二个独立的if (w_queue->front->next == NULL)会立刻触发(因为刚创建的节点next为NULL),直接破坏刚建立的链表结构。

错误2:单节点队列的处理逻辑完全错误

原代码中处理单节点队列时,错误地修改了front指针,还让原front节点的next指向新节点后,又把front重置为新节点,导致第一个节点被孤立,后续入队的节点无法正确链接到链表中。


修正后的代码

void enqueue_w(student_info *CSC4352_queue, int *rear, w_list *w_queue, student_info ToEnqueue)
{
    // 分配新节点内存
    node *added_student = (node *)malloc(sizeof(node));
    if (added_student == NULL)
    {
        return;
    }
    // 复制学生数据
    added_student->student.ID = ToEnqueue.ID;
    strcpy(added_student->student.name, ToEnqueue.name);
    added_student->next = NULL;

    if (w_queue->front == NULL)
    {
        // 队列为空时,头尾指针都指向新节点
        w_queue->front = w_queue->rear = added_student;
    }
    else
    {
        // 队列非空时,将新节点挂在队尾,更新队尾指针
        w_queue->rear->next = added_student;
        w_queue->rear = added_student;
    }
}

关键说明

  1. 合并了分支逻辑:不需要单独处理队列只有一个节点的情况,因为"队尾节点的next指向新节点,然后更新队尾指针"的逻辑适用于所有非空队列的场景,包括只有一个节点的情况。
  2. 确保分支互斥:用else替代原有的第二个独立if,避免初始化队列后立刻进入错误分支。

测试修改后的代码,多次入队的节点会正确链接成链表,不会再出现覆盖或丢失的问题。

内容的提问来源于stack exchange,提问作者Réda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:32:49