戳这里还有其他数据结构的题目噢
https://blog.csdn.net/qq_45724947/article/details/115625130?spm=1001.2014.3001.5501
约瑟夫环问题(选做):设计并验证以下算法:用线性表的顺序存储句结构模拟约瑟夫环淘汰过程,按出列顺序输出各人的编号,以及存活的最后一名玩家编号。
(1) 约瑟夫问题的一种描述是,编号未1、2、………、n的n个人按顺时针方向围坐成一个圈,每人持有一个密码,一开始选一个正整数作为报数上限值m,从第一个人开始以顺时针方向自1开始报数,报到m时停止,报到m的人出列,将他的密码作为新的m的值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到所有人出列。
(2) 利用线性表的顺序存储结构模拟此过程,按出列的顺序输出各人的编号。
(3) 程序运行后,首先要求用户指定初始报数上限值,然后读取各人的密码。
直接上代码:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0 //函数结果状态代码
#define INFEASIBLE -1
#define OVERFLOW -2
typedef struct
{
int *elem;//密码内容
int length;//总长度
int list_size;// 总长度
}sqlist;
int init_list(sqlist &l,int n)//创建顺序表 (删代码需要注意)
{
l.elem = (int *)malloc(sizeof(int)*n);
if(!l.elem)
return OVERFLOW;
l.length = 0;
l.list_size = n;
return OK;
}
void scanf_list(sqlist &l)//输入顺序表
{
printf("请输入每个同学持有密码:\n");
for(int i = 0;i < l.list_size; i++)
{
printf("第%d个同学的密码:",i+1);
scanf("%d",l.elem + i);//输入每个同学持有的密码
l.length ++;
}
printf("\n");
}
void print_result(sqlist &l,int bingo) //first初始报数时计数变量
{
int m = 0,k = 0; //m为退出人数,k报数时计数变量
int i = 0; //i为每次循环时计数变量
while(m < l.length - 1) //还有超过1人未退出时,执行循环
{
if(*(l.elem+i) != -1) //跳出赋值为-1的
k++;
if(k == bingo) //等于新生密码时进行操作
{
m++; //又多了跳出的一个人
printf("第%d个出队编号为:%d\n",m,i+1);
bingo = *(l.elem+i); //把他自己的密码拿过来
*(l.elem+i) = -1; //将他赋值-1
k = 0; //重新计算报数k
}
i++;
if(i == l.length)
i = 0;
}
while(*(l.elem+i) == -1)
i++;//最后剩下来的人编号不=0,寻找这一个
printf("最后一个出队的编号为%d\n",i+1);//把编号不为0的编号输出即可
}
int main()
{
int n,k;//n为总人数,k报数时计数变量;
sqlist L1;
printf("请输入参加总人数:");
scanf("%d",&n);
printf("请输入 初始报数上限值:");
scanf("%d",&k);
init_list(L1,n);
scanf_list(L1);
print_result(L1,k);
return 0;
}
(请不要直接复制使用。代码仅供参考,希望读者借此代码自身可以理解学习)
如果代码对您有帮助,不要忘记评论收藏噢~