数组实现队列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
相关产品推荐
相关产品推荐

