队列满和队列空的判断逻辑问题:full 函数返回 1 表示满,但是判断条件应返回非0值表示真(在 C 中常用),return -1 会被认为是假,这与预期相反。
empty 函数逻辑也是反的,return -1 表示队列为空时实际应返回真(1),但返回了假(-1)。
pop 函数中的逻辑错误:在检查队列是否空时,empty(st) 应该返回 1 时表示空,但是您的代码中使用了 !empty(st) 表示队列为空。
男女判断和性别输入错误处理逻辑错误:当性别为男('M')时,应该只进入男队列逻辑分支,但是代码当前会继续检查性别输入错误的逻辑。
修正后的部分关键代码:
int full(S* st) {
return (st->rear + 1) % size == st->front;
}
int empty(S* st) {
return st->rear == st->front;
}
int enter(S* st, people person) {
if (full(st)) {
printf("队列已满\n");
return 1; // 队列满时返回1
}
st->ren[st->rear] = person;
st->rear = (st->rear + 1) % size;
return 0; // 插入成功返回0
}
int pop(S* st, people* person) {
if (empty(st)) {
printf("空\n");
return 0; // 队列空时返回0
}
*person = st->ren[st->front];
st->front = (st->front + 1) % size;
return 1; // 弹出成功返回1
}
// 修改舞伴配对逻辑
void dance(people dancers[], int n) {
S man, woman;
people person;
init(&man);
init(&woman);
int i;
for (i = 0; i < n; i++) {
if (dancers[i].male == 'F') {
enter(&woman, dancers[i]);
} else if (dancers[i].male == 'M') {
enter(&man, dancers[i]);
} else {
printf("性别输入错误:%s %c\n", dancers[i].name, dancers[i].male);
}
}
printf("舞伴配对如下\n");
while (!empty(&man) && !empty(&woman)) {
pop(&woman, &person);
printf("%s女士与", person.name);
pop(&man, &person);
printf("%s男士配对\n", person.name);
}
if (!empty(&man)) {
person = gethead(man);
printf("%s男士将在下一轮第一个获得匹配机会\n", person.name);
}
if (!empty(&woman)) {
person = gethead(woman);
printf("%s女士将在下一轮第一个获得匹配机会\n", person.name);
}
}
代码修正了队列判断逻辑,并调整了条件判断,以确保程序逻辑正确且不会陷入无限循环。
同时,确保了性别错误的逻辑仅在真正输入错误时才触发。 |