约瑟夫环算法-数据结构c语言版

/*实验目的
熟悉线性表的基本运算在顺序存储结构和链式存储结构上的实现,其中重点熟悉链表的各种操作。
时间要求:4学时
问题描述:
约瑟夫(Joseph)问题的一种描述是:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码〈正整数〉,一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
基本要求:
利用单向循环链表存储结构模拟此过程,按照出列的顺序打印出各人的编号。
实现提示:
程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码(小于30)。
选作内容:
在顺序存储结构上实现上述问题的操作。
Input
输入包括两行,第一行包括报数上限值m和人数n,第二行为n个人的密码,所有数据之间由空格分隔。
Output
输出一行,共n个整数,表示各编号人的出列顺序。各数之间由空格分隔。
Sample Input
20 7
3 1 7 2 4 8 4
Sample Output
6 1 4 7 2 3 5

*/

#include
#include
typedef struct Node
{
int key;//密码
int num;//编号
struct Node *next;//指向下一个节点
}Node,*Link;


void InitList(Link &L) //创建一个空的链表
{
L=(Node *)malloc(sizeof(Node));
if(!L) exit(1);
L->key=0;
L->num=0;
L->next=L;
}

void Creatlinklist(int n,Link &L) //初始化链表
{
Link p,q;
q=L;
for(int i=1;i<=n;i++)
{
p=(Node *)malloc(sizeof(Node));
if(!p) exit(1);
scanf("%d",&p->key);
p->num=i;
L->next=p;
L=p;
}
L->next=q->next;
free(q);
}

Link Locate_m(Link &p,int m)//找到第m个
{
Link q;
for(int j=1;jp=p->next;
q=p->next;
m=q->key;
return q;
}


void Delete_m(Link &L,Link p,Link q)//删除第m个
{
p->next=q->next;
free(q);
}


void main()
{
Link L,p,q;
int n,m;
L=NULL;
InitList(L);//构造出一个只有头结点的空链表

scanf("%d",&m);//初始密码为m
scanf("%d",&n);//总共的人数n

Creatlinklist(n,L);//建立好一个约瑟夫环
p=L;

for(int i=1;i<=n;i++)
{
q=Locate_m(p,m);//找到第m个

printf("%d ",q->num);

Delete_m(L,p,q);//删除第m个
}
}
//输入次序依次为初始密码m,总共的人数n,再输入n个人各自拥有的密码






相关主题
相关文档
最新文档