您的位置:首页 > 其它

约瑟夫环问题

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

  这里给出的例子中,是从编号为1的人开始报数,数到5的人出列。

/*约瑟夫环问题*/

#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
int    num;
struct Node *next;
}LinkList;

//创建长度为 n 的链表
LinkList *creat(int n)
{
LinkList *p,*q,*head;
int i=1;
p=(LinkList *)malloc(sizeof(LinkList));
p->num=i;
head=p;
for(i=2;i<=n;i++)
{
q=(LinkList *)malloc(sizeof(LinkList));
q->num=i;
p->next=q;
p=q;        /*p指向当前节点*/
}
p->next=head;    /*使链表尾指向链表头,形成循环链表,相当于约瑟夫环*/
return head;
}

void fun(LinkList *L,int m)
{
LinkList *p,*s,*q;
p=L;
printf("出列顺序为:");
while(p->next != p)
{
for(int i=1;i<m;i++)
{    q=p;
p=p->next;
}
printf("%4d",p->num);
s=p;            /*暂存节点,便于释放*/
q->next=p->next;
p=p->next;
free(s);        /*节点值输出后释放资源*/
}
printf("%4d\n",p->num);  /*输出最后一个节点中数值*/
}

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