您的位置:首页 > 其它

循环链表-圆桌出列问题

2017-09-05 15:56 218 查看
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

以下是C++实现代码

#include <cstdlib>
#include <cstdio>
typedef struct LNode{
int data;
struct LNode *link;
}LNode,*LinkList;


//建立无头结点的循环链表

LinkList Create( int n )
{
LinkList head,p,temp;
head=NULL;
p=head;
int i;
for( i=1;i<=n;i++ ){
temp=(LinkList)malloc(sizeof(LNode));
temp->data=i;
if( head==NULL ){
head=temp;
p=head;
}else{
p->link=temp;
p=temp;
}
}
p->link=head;
return head;
}


//出列函数

void function( int n,int m,int k )
{
LinkList head,p,q;
head=Create(n);
int i;
printf( "the list is:\n" );
p=head;

for( i=0;i<n;i++ ){
printf( "%d ",p->data );
p=p->link;}
printf("\n");
p=head;
//找到第一个报数的结点,即编号为k的结点
for( i=0;i<n;i++ ){
if( k==p->data )
break;
p=p->link;
}
//循环数1到m,出列
while( n-- ){
for( i=1;i<m;i++ ){
q=p;
p=p->link;
}
printf( " %d out\n",p->data );
q->link=p->link;
free(p);
p=q->link;

}
}


//主函数

int main()
{
function(5,4,2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: