约瑟夫环

约瑟夫环问题。
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
        int index;//索引,从1开始
struct Node* next;
}Node,*LinkList;
//循环单链表
void InitList(LinkList* L)
{
(*L) = (Node*)malloc(sizeof(Node));
(*L)->next = (*L);
}
//创建单链表
void CreatListTail(LinkList L,int n)
{
Node* s;
Node* r;
int i;
r = L;
for(i=1;i<=n;++i)
{
s = (Node*)malloc(sizeof(Node));
s->index = i;
r->next = s;
r = s;
}
r->next = L;
}
//显示单链表
void ShowList(LinkList L)
{
Node* r;
r = L;
while(r->next != L)
{
r = r->next;
printf("%d ",r->index);
}
printf("\n");
}
void YSF(LinkList L,int k,int m,int n)
{
Node* s;
Node* r;
int i,j;
s = L;
for(i=1;i<k;++i)
{
s = s->next;
}
while(n>0)
{
j = 0;
while(j+1!=m)
{
s = s->next;//找到的s为要出列的前一个节点
if(s->next == L)
{
s->next = L->next;
}
++j;
}
r = s->next;//r为要删除的节点
s->next = s->next->next;
printf("%d ",r->index);
free(r);
//s = s->next;
--n;
}
}
int main(void)
{
LinkList L;
int n,k,m;
printf("请输入有多少个人:");
scanf("%d",&n);
//创建循环链表
InitList(&L);
CreatListTail(L,n);
ShowList(L);
printf("从第几个人开始数起:");
scanf("%d",&k);
printf("数到m出列,请输入m的值:");
scanf("%d",&m);
printf("出列序号为:");
YSF(L,k,m,n);
printf("\n");
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值