约瑟夫环问题

代码:

#include<stdio.h>  

#include<math.h>  
#include<conio.h>
#define OVERFLOW -1
typedef int Elemtype;/*定义数据元素类型*/
/*数据类型定义*/
typedef struct Cnode
{
Elemtype data;
struct Cnode *next;
}CNode;
CNode *joseph;/*定义一个全局变量*/
/*创建单循环链表函数*/
int Create_clist(CNode *clist,int n)
{
CNode *p,*q;
int i;
clist=NULL;
for(i=n;i>=1;i--)
{
p=(CNode *)malloc(sizeof(CNode));
if(p==NULL)
    return OVERFLOW;/*存储分配失败*/
p->data=i;
p->next=clist;
clist=p;
if(i==n)
    q=p;
}
q->next=clist;
joseph=clist;
return 1;
}
int Joseph(CNode *clist,int m,int n,int k)
{
int i;
CNode *p,*q;
if(m>n)
return -1;
if(!Create_clist(clist,n))
return -1;
p=joseph;
for(i=1;i<m;i++)
p=p->next;
while(p)
{
for(i=1;i<k-1;i++)
p=p->next;
q=p->next;
printf("%d",q->data);
printf(" ");


if(p->next==p)
p=NULL;
else
{
p->next=q->next;
p=p->next;
free(q);
}
}
clist=NULL;
return 1;
}
void main()
{
int m,n,k;
CNode *clist;
clist=NULL;
printf("\n请输入围坐在圆桌周围的人数 n: ");
scanf("%d",&n);
printf("请输入第一次开始报数人的位置 m: ");
scanf("%d",&m);
printf("请输入报数为多少的人出列?");
scanf("%d",&k);
Create_clist(clist,n);
printf("出列的顺序如下:\n");
Joseph(clist,m,n,k);
printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值