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; } }
关键说明
- 合并了分支逻辑:不需要单独处理队列只有一个节点的情况,因为"队尾节点的next指向新节点,然后更新队尾指针"的逻辑适用于所有非空队列的场景,包括只有一个节点的情况。
- 确保分支互斥:用
else替代原有的第二个独立if,避免初始化队列后立刻进入错误分支。
测试修改后的代码,多次入队的节点会正确链接成链表,不会再出现覆盖或丢失的问题。
内容的提问来源于stack exchange,提问作者Réda
相关产品推荐
相关产品推荐

