C语言采用单向环表实现约瑟夫环请按以下要求编程实现:① 从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表.环表中的结点编号依次为1,2,……,m.② 从键盘输入整数s(1

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/05 21:58:29

C语言采用单向环表实现约瑟夫环请按以下要求编程实现:① 从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表.环表中的结点编号依次为1,2,……,m.② 从键盘输入整数s(1
C语言采用单向环表实现约瑟夫环
请按以下要求编程实现:
① 从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表.环表中的结点编号依次为1,2,……,m.
② 从键盘输入整数s(1

C语言采用单向环表实现约瑟夫环请按以下要求编程实现:① 从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表.环表中的结点编号依次为1,2,……,m.② 从键盘输入整数s(1
刚写的 不知道是否符合你的要求
#include
struct Josephus
{
int data;
Josephus *next;
};
Josephus *op =NULL; // 创建一个头指针
void create( int num )
{
Josephus * JO = new Josephus[num]; //初始化num个结点数据存储空间,
op = JO;
for ( int i = 1; i data = i;
op->next = JO + i%num;
op = op->next;
}
}
void showJosephus( struct Josephus *point,int num )
{
for ( int i = 1; i data);
point = point->next;
}
}
void calJosephus( struct Josephus * head,int data,int loca,int num )
{
Josephus *cur_point;
head = &op[loca-1];
int k = 0;
while( head->next != head )
{
printf("\n第%d次出局:",k+1);
for ( int i = 1; i < data; i++ )
{
cur_point = head;
head = cur_point->next;
}
printf("%d",head->data);
cur_point->next = head->next;
head = head->next;
k++;
}
printf("\n\n最后的赢家:");
printf("%d",head->data);
}
int main()
{
int m; // 结点数
int n; // 每次要抽选的数据
int s; // 要开始的指针
// 创建环表
printf("输入需要创建的结点数:") ;
scanf("%d",&m);
create(m);
// 显示Josephus环
showJosephus( op,m );
// 显示过程
printf("\n从第几个数结点开始计数?:") ;
scanf( "%d",&s );
printf("抽选第一个?:") ;
scanf( "%d",&n );
printf("\n过程:") ;
calJosephus( op,n,s,m );
return 0;
}