/**
*约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
*从编号为k的人开始报数,数到m的那个人出列;
*他的下一个人又从1开始报数,数到m的那个人又出列;
*依此规律重复下去,直到圆桌周围的人全部出列。
*实现方式:循环链表
*2013-10-15
**/
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void JOSEPHUS(int n,int k,int m)//n为总人数,k为第一个开始报数的人,m为出列者喊到的数
{
/*p为当前节点,r为辅助节点,指向p的前驱节点,l为头节点*/
LinkList p,r,L;
p = r = L = NULL;
//建立循环链表
int i;
for ( i = 0; i < n; i++ )
{
p = (LinkList)malloc(sizeof(LNode));
p->data = i + 1;
if ( L == NULL )
{
L = p;
r = p;
}
else
{
r->next = p;
r = p;
}
}
//把链表连起来
p->next = L;
//输出链表
p = L;
cout << "输入链表" <<endl;
for(i=0 ; i<n ; i++)
{
cout << p->data <<" ";
p = p->next;
}
cout << endl;
//将p重新指向头
p = L;
//把当前指针移动到第一个报数的人
for(i=1 ; i<k ; i++)
{
r = p;
p = p->next;
}
cout << "输出链表"<<endl;
//循环的删除队列结点
while ( p->next != p )
{
for ( i = 0; i < m - 1; i++ )
{
r = p;
p = p->next;
}
//指向的是第一个人,则将r指向最后一个元素
if ( p == L )
{
L = p->next;
r = p;
while( r->next != p )
r = r->next;
}
r->next = p->next;
cout << p->data <<" ";
free(p);
p = r->next;
}
cout << p->data <<endl;
}
int main()
{
JOSEPHUS(13,9,2);
return 0;
}
约瑟夫环问题
最新推荐文章于 2022-05-04 19:46:17 发布