一组人(n)个,围成一圈,从某人开始数到滴三个的人出列,在接着从下一个人开始数,最终输出最终出列的人(约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3,...,n)分别表示)围坐在一张圆桌周围。从编号k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,知道圆桌周围的人全都出列。
代码如下:
#include <iostream>
#include <string>
#include <stdlib.h>
#include <malloc.h>
using namespace std;
typedef struct Node //定义链表结点
{
int data;
struct Node *next;
}LinkList;
LinkList *Create(int n) //建立一个约瑟夫环,用循环单链表表示,在数据区域是约瑟夫环元素的编号信息
{
LinkList *p,*q,*head;
int i = 1;
p = (LinkList *)malloc(sizeof(LinkList));
p->data = i;
head = p;
for(i=1;i<=n;i++)
{
q=(LinkList *)malloc(sizeof(LinkList));
q->data = i+1;
p->next = q;
p =q;
}
p->next = head;//是链表尾链接表头形成循环链表
return head;
free(p);
p = NULL;
free(q);
q = NULL;
}//约瑟夫环创建过程
void deletefun(LinkList *L,int m) //约瑟夫环元素出列的具体操作
{
LinkList *p,*q,*temp;
int i;
p = L;
while(p->next!=p) //判断结点是否为尾结点的条件
{
for(i =1;i<m;i++)//这个循环模拟了报数环节,
{
q=p;
p =p->next;
}<span style="white-space:pre"> </span>//当报到第m个数时,跳出for循环,执行删除该结点的操作
cout<<p->data<<endl;
temp = p; //利用一个临时变量来p结点
q->next = p->next;
p = p->next;
free(temp);
}
cout<<p->data<<endl;
}
int main()
{
int n=7,m = 3;
LinkList *head1;
head1 = Create(n);
deletefun(head1,m);
return 0;
}