用循环链表实现约瑟夫回环问题;
数据结构;
循环链表的应用(约瑟夫回环问题)n个数据元素构成一个环,从环中任意位置开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。
用c语言执行。
代码如下
#include<stdio.h>
#include<stdlib.h>
typedef struct Sqlist{
int data;
struct Sqlist* next;
}Sqlist,*LinkList;
void InitList(LinkList &L){
L=(Sqlist*)malloc(sizeof(Sqlist));
L->next=L;
}
void ListInsert(LinkList &L,int i,int e)
{
Sqlist *p=NULL;
int j=0;
p=L;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
Sqlist *s=(Sqlist*)malloc(sizeof(Sqlist));
s->data=e;
s->next=p->next;
p->next=s;
}//构建循环链表
int a(LinkList &L,int n,int m)
{ Sqlist*p=NULL;
p=L;
int a,j;
for(a=1;a<n;a++)
{
for(j=0;j<m;j++)
p=p->next;
p->next=p->next->next;
}
return (p->data);
}//循环取出操作
int main()
{
int i,n,m;
scanf("%d %d",&n,&m);//n个数据元素构成环,计数到m取出;
LinkList L;
InitList(L);
for(i=1;i<=n;i++)
ListInsert(L,i,i);
printf("%d",a(L,n,m));
return 0;
}