您的位置:首页 > 理论基础 > 数据结构算法

约瑟夫环问题 数据结构 c语言

2009-06-02 22:37 357 查看
一:约瑟夫环问题(第二章)
约瑟夫问题的一种描述是:编号为1,2,……,n的n个人按顺时针方向坐一圈,没人持有一个密码(正整数)。一开始任选一个作为报数上限值m,从第一个开始顺时针自1开始顺序报数,报到m是停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人重新从1报数,如此下去,直到所有的人全部出列为止。设计一个程序,求出出列顺序。
利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编码。
例如m的初值为20,n=7,7个人的密码依次为3,1,7,2,4,8,4出列的顺序是6,1,4,7,2,3,5。

1、程序代码
#include<stdio.h>
typedef struct data
{
int num;
int val;
}typdata;
typedef struct node
{
typdata data;
struct node*next;
}listnode;
typedef listnode*linklist;
linklist head;

void main()
{
int n,i,b,m,j;
linklist head=(listnode*)malloc(sizeof(listnode));
listnode *p,*q;
printf("please input the totle number:");
scanf("%d",&n);
q=head;
for(j=1;j<=n;j++)
{
printf("please input the node of No.%d student:/n",j);
scanf("%d",&b);
printf("%n");
q->next=(listnode*)malloc(sizeof(listnode));
q=q->next;
q->data.val=b;
q->data.num=j;
q->next=head->next;}
printf("please input a number:/n");
scanf("%d",&m);
if(m<=0)
printf("ERROR!/n");
else
{
printf("The answer is:/n");
do
{
i=1;
while(i!=m)
{
q=q->next;
i++;
}
p=q->next;
q->next=p->next;
printf("num:%d/tval:%d/n",p->data.num,p->data.val);
free(p);
}
while(q->next!=q);
printf("num:%d/tval:%d/n",q->data.num,q->data.val);
free(q);
free(head);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: