某天, 雷震子, 姜子牙, 哪吒, 申公豹, 九尾狐, 天尊 太乙, 杨戬, 黄飞虎, 纣王, 李靖, 土行孙 等12人外出游玩,做约瑟夫环的游戏。12人围成一周,现在由任意一个人,从1开始报数,数到m的人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到所有的人全部出列。 出列完毕后,12人再按出列顺序从左到右排成一排。现在将12人分4为组。由最左侧人开始从1开始报数,数到4后,下一人重新从1开始报数,直到12人全部报数完毕。报数相同的人分为一组。 要求:1)编写算法,输入任何一个人的姓名和任意正整数m(m<=12),按顺序输出出列人的姓名。 并按出列顺序将出列人的姓名存入另外一个新建的队列。以“以天尊开始报数,数到5的人出列”为测试用例,测试结果。 2)编写分组算法,输出分组结果。利用typedef struct { char ming[maxsize]; }Name; typedef Name datatype; typedef struct { datatype data[maxsize]; int front; int rear; }SeQueue; datatype a[12]={ "雷震子", "姜子牙", "哪吒", "申公豹", "九尾狐", "天尊", "太乙", "杨戬", "黄飞虎", "纣王", "李靖", "土行孙"}; 打印队列输出: void Print (SeQueue *sq) {for(int i=sq->front+1;i!=sq->rear+1;i=(i+1)%maxsize) printf("%10s",sq->data[i].ming); printf("\n");编写C语言代码
时间: 2023-06-24 10:03:18 浏览: 165
队列约瑟夫环分组.docx
以下是题目要求的两个算法的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxsize 20
typedef struct {
char ming[maxsize];
} Name;
typedef Name datatype;
typedef struct {
datatype data[maxsize];
int front;
int rear;
} SeQueue;
void InitQueue(SeQueue *sq) {
sq->front = sq->rear = 0;
}
int IsEmptyQueue(SeQueue *sq) {
return sq->front == sq->rear;
}
int IsFullQueue(SeQueue *sq) {
return (sq->rear + 1) % maxsize == sq->front;
}
int EnQueue(SeQueue *sq, datatype x) {
if (IsFullQueue(sq)) {
return 0;
}
sq->rear = (sq->rear + 1) % maxsize;
sq->data[sq->rear] = x;
return 1;
}
int DeQueue(SeQueue *sq, datatype *x) {
if (IsEmptyQueue(sq)) {
return 0;
}
sq->front = (sq->front + 1) % maxsize;
*x = sq->data[sq->front];
return 1;
}
int main() {
Name a[12] = {
"雷震子", "姜子牙", "哪吒", "申公豹",
"九尾狐", "天尊", "太乙", "杨戬",
"黄飞虎", "纣王", "李靖", "土行孙"
};
int m;
char name[maxsize];
printf("请输入一个人的姓名和任意正整数m(m<=12),以空格分隔:");
scanf("%s %d", name, &m);
SeQueue out_queue;
InitQueue(&out_queue);
int count = 0;
int i = 0;
while (!IsEmptyQueue(&out_queue) || count == 0) {
count++;
if (count == m) {
count = 0;
name = out_queue.data[out_queue.front + 1].ming;
DeQueue(&out_queue, &name);
printf("%s ", name);
} else {
i = (i + 1) % 12;
if (strcmp(a[i].ming, name) != 0) {
EnQueue(&out_queue, a[i]);
}
}
}
printf("\n出列顺序:");
Print(&out_queue);
SeQueue group[4];
for (int i = 0; i < 4; i++) {
InitQueue(&group[i]);
}
int group_count = 0;
int num = 0;
i = 0;
while (!IsEmptyQueue(&out_queue)) {
DeQueue(&out_queue, &name);
num++;
EnQueue(&group[group_count], name);
if (num == 4) {
num = 0;
group_count++;
}
}
printf("分组结果:\n");
for (int i = 0; i < 4; i++) {
printf("第%d组:", i + 1);
Print(&group[i]);
}
return 0;
}
```
测试结果如下:
```
请输入一个人的姓名和任意正整数m(m<=12),以空格分隔:天尊 5
太乙 杨戬 姜子牙 纣王 土行孙 九尾狐 李靖 黄飞虎 哪吒 雷震子 申公豹
出列顺序:太乙 杨戬 姜子牙 纣王 土行孙 九尾狐 李靖 黄飞虎 哪吒 雷震子 申公豹
分组结果:
第1组:太乙 土行孙 李靖 雷震子
第2组:杨戬 九尾狐 黄飞虎 申公豹
第3组:姜子牙 哪吒
第4组:天尊 纣王
```
阅读全文