您的位置:首页 > 其它

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

2017-08-24 11:38 363 查看
#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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: