根据软件设计基础课程,用c语言写一段代码,实现实现1 实验目的 掌握队列结构的实现方式 掌握队列成员算法的实现。 熟悉利用队列解决问题的一般思路。 2实验内容与要求 某天, 雷震子, 姜子牙, 哪 吒, 申公豹, 九尾狐, 天 尊 太 乙, 杨 戬, 黄飞虎, 纣 王, 李 靖, 土行孙 等12人外出游玩,做约瑟夫环的游戏。12人围成一周,现在由任意一个人,从1开始报数,数到m的人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到所有的人全部出列。 出列完毕后,12人再按出列顺序从左到右排成一排。现在将12人分4为组。由最左侧人开始从1开始报数,数到4后,下一人重新从1开始报数,直到12人全部报数完毕。报数相同的人分为一组。 要求:1)编写算法,输入任何一个人的姓名和任意正整数m(m<=12),按顺序输出出列人的姓名。 并按出列顺序将出列人的姓名存入另外一个新建的队列。 2)编写分组算法,输出分组结果。3)有代码注释
时间: 2024-03-05 09:47:33 浏览: 91
以下是用C语言实现约瑟夫环游戏和分组的代码,注释已经加上:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 20 //队列的最大长度
typedef struct {
char name[10]; //姓名
int number; //编号
} Person;
typedef struct {
Person data[MAXSIZE]; //存储队列中的人物信息
int front; //队头指针
int rear; //队尾指针
} SeqQueue;
//初始化队列
void InitQueue(SeqQueue *Q) {
Q->front = Q->rear = 0;
}
//判断队列是否为空
int QueueEmpty(SeqQueue Q) {
if (Q.front == Q.rear)
return 1; //队列为空
else
return 0;
}
//判断队列是否已满
int QueueFull(SeqQueue Q) {
if ((Q.rear + 1) % MAXSIZE == Q.front)
return 1; //队列已满
else
return 0;
}
//入队操作
int EnQueue(SeqQueue *Q, Person x) {
if (QueueFull(*Q))
return 0; //队列已满,入队失败
else {
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % MAXSIZE;
return 1; //入队成功
}
}
//出队操作
int DeQueue(SeqQueue *Q, Person *x) {
if (QueueEmpty(*Q))
return 0; //队列为空,出队失败
else {
*x = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return 1; //出队成功
}
}
//约瑟夫环游戏
void josephus(SeqQueue *Q, int m) {
int i;
Person x;
while (!QueueEmpty(*Q)) {
//数到m的人出列
for (i = 1; i < m; i++) {
DeQueue(Q, &x);
EnQueue(Q, x);
}
DeQueue(Q, &x);
//输出出列人的姓名
printf("%s ", x.name);
//将出列人的姓名存入另外一个新建的队列
EnQueue(&newQueue, x);
}
printf("\n");
}
//分组
void grouping(SeqQueue *Q) {
int i, j, k;
Person x;
SeqQueue group[4]; //存储分组结果的队列数组
//初始化四个队列
for (i = 0; i < 4; i++) {
InitQueue(&group[i]);
}
j = 0; //记录当前报数的人所在的队列编号
k = 1; //记录当前报数的人的编号
while (!QueueEmpty(newQueue)) {
DeQueue(&newQueue, &x);
//将当前报数的人放入对应的队列中
EnQueue(&group[j], x);
//报数加1
k++;
//如果报数达到4,则下一个人重新从1开始报数
if (k > 4) {
k = 1;
//队列编号加1
j++;
//如果队列编号为4,则重新从0开始
if (j > 3)
j = 0;
}
}
//输出分组结果
for (i = 0; i < 4; i++) {
printf("第%d组:", i + 1);
while (!QueueEmpty(group[i])) {
DeQueue(&group[i], &x);
printf("%s ", x.name);
}
printf("\n");
}
}
int main() {
SeqQueue Q;
char name[10];
int m, i;
Person x;
printf("请输入约瑟夫环游戏中的m值:");
scanf("%d", &m);
//初始化队列
InitQueue(&Q);
//将12个人依次入队
for (i = 1; i <= 12; i++) {
sprintf(name, "person%d", i);
strcpy(x.name, name);
x.number = i;
EnQueue(&Q, x);
}
//进行约瑟夫环游戏
josephus(&Q, m);
//分组
grouping(&newQueue);
return 0;
}
```
在上述代码中,我们定义了两个队列:原队列 `Q` 和新队列 `newQueue`,其中原队列 `Q` 存储的是12个人的信息,新队列 `newQueue` 存储的是按出列顺序排列的人的姓名。在进行约瑟夫环游戏时,每出列一个人都将其姓名入队到新队列 `newQueue` 中。在分组时,我们使用了一个队列数组 `group` 存储分组结果,其中 `group[i]` 表示第 i+1 组。最后,我们将每个队列中的人的姓名输出即可。
阅读全文