【链表】单链表循环解决Josephus问题

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


struct Node;
typedef Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;


struct Node
{
int val;
Position Next;
};


void Insert(int val, List list,Position pos)
{
Node *p;
p = (Node *)malloc(sizeof(Node));
p->val = val;
pos->Next = p;
p->Next = list->Next;
}


Position Delete(List list,Position p,int N)
{
Node *BeforeP, *AfterP;
BeforeP = list;  
AfterP = p->Next;
for (int i = 0; i < N; i++)
{
BeforeP = BeforeP->Next;
if (BeforeP->Next->val == p->val) break;
}
BeforeP->Next = AfterP;
printf("淘汰了第%d个人. . .\n", p->val);
return AfterP;
}


void main()
{
List list = (Node *)malloc(sizeof(Node));
Node *p, *l; Position pos = list;
list->Next = list;
int N, M;
printf("输入多少人:");
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
Insert(i, list,pos);
pos = pos->Next;
}
l = list->Next;
/*for (int i = 0; i < 2 * N; i++)
{
printf("%d ", l->val);
l = l->Next;
}*/


printf("\n输入传递几次:");
scanf("%d", &M);
printf("\n比赛开始. . .\n");
int count = N;
p = list->Next;
while (--count) {
for (int i = 0; i < M; i++) p = p->Next;
p = Delete(list, p, N);
}
printf("\n第%d个人获得胜利. . .\n", p->val);
getchar(); getchar();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值