#include<stdio.h>
//用循环单链表处理约瑟夫问题
//首先建立单链表
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
//初始化
int InitList(LinkList &L)
{
L=new LNode;
L->next=L; //转为循环链表
L->data=1; //为了循环中每一个节点都有值,头结点中赋值
return 0;
}
//插入
void ListInsert(LinkList &L,int i,int e)
{
LNode *p=L;
int j=0;
while(j<i-1)
{
p=p->next ;
++j;
}
LNode *s=new LNode;
s->data=e;
s->next=p->next ;
p->next=s;
} //建立循环链表同时赋值其编号
//录入
void Scan(LinkList &L,int n)
{
int i;
for(i=0;i<n-1;i++)
ListInsert(L,i+1,i+2); //因为头结点中赋了值,所以在这里赋值是少插入一次,每一次赋值时多赋一个数
}
//查找函数
void Find(int j,LinkList &L)
{
for(int i=0;i<j;i++)
L=L->next; //每一次查找时直接将L指到查找后的位置
}
//删除
void ListDelete(LinkList &L)
{
LNode *p=L;
LNode *q=p;
p->next=q->next->next;
delete q;
}
void Result(int n,int k,LinkList &L) //结果函数
{
for(int i=0;i<n;i++) //循环,直到该链表全被释放
{
Find(k-1,L); //从第m个数开始计数,找到第k-1个
LNode *p=L->next;
L->next=p->next;
L=L->next;
printf("第%d个出列的人:%d\n",i+1,p->data);
ListDelete(p); //找到并输出后,释放该数
}
}
void Putout(LinkList L)
{
LNode *p=L;
for(;p->next!=L;p=p->next)
printf("%d\n",p->data);
printf("%d\n",p->data);
}
int main()
{
int n,m,k,b;
LinkList L; //所需变量的定义
printf("How many people:");
scanf("%d",&n); //输入多少人
InitList(L); //初始化
Scan(L,n); //创建链表并为其编号
printf("Start with which numbers:");
scanf("%d",&m);
printf("How many people cycle once:");
scanf("%d",&k); //定义开始编号和循环人数
Find(m,L);
Result(n,k,L);
return 0;
}
约瑟夫环问题
最新推荐文章于 2020-11-18 14:17:39 发布