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

数组实现队列enqueue操作时出现重复数据问题求助

队列重复数据问题的修复方案

核心问题分析

你的入队函数enqueue_CSC存在逻辑分支未正确终止的问题:

  • 当队列为空(*rear == -1)时,你将*rear设为0并添加了学生数据,但之后没有跳出当前逻辑,代码继续执行到CSC4352_queue[++(*rear)] = ToEnqueue;,导致同一学生被再次插入到索引1的位置,这就是重复数据的来源。
  • 队列满的判断(*rear ==4)没有和后续逻辑隔离,即使触发了满队列的情况,若前面的分支没终止,后续代码仍可能执行。

修复后的入队函数

int enqueue_CSC(student_info *CSC4352_queue, int *rear, student_info ToEnqueue)
{
    // 状态值:1表示成功加入课程,0表示进入等待列表
    int status;

    // 先判断队列是否已满
    if (*rear == 4)
    {
        printf("\t大数据分析(CSC 4352)课程无剩余名额。\n");
        printf("\t你将被加入等待列表。\n");
        status = 0;
        return status;
    }

    // 处理空队列情况
    if (*rear == -1)
    {
        *rear = 0;
        CSC4352_queue[*rear] = ToEnqueue;
        status = 1;
        return status;
    }

    // 队列非空且未满,正常入队
    CSC4352_queue[++(*rear)] = ToEnqueue;
    status = 1;
    return status;
}

打印函数的优化

你的打印函数循环条件i < rear会漏掉最后一个元素(因为rear是最后一个元素的索引),应该改为i <= rear;如果队列使用可变的front指针,建议从front开始遍历以适配完整的队列逻辑:

void print_CSC4352_queue(student_info *CSC4352_queue, int rear, int front)
{
    printf("CSC 4352队列内容:\n");
    // 从front遍历到rear,适配完整队列逻辑
    for (int i = front; i <= rear; i++)
    {
        printf("\t学生ID:%d\n", CSC4352_queue[i].ID);
        printf("\t学生姓名:%s\n", CSC4352_queue[i].name);
        printf("\n");
    }
    return;
}

关键修复点总结

  • 队列满的判断提前,避免后续无效操作
  • 每个分支处理完成后添加return,防止代码继续执行导致重复插入
  • 修正打印函数的循环范围,确保所有元素都被输出

内容的提问来源于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.25 18:12:22