【链表】单链表循环解决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();
}
#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();
}
相关文章推荐
- 循环链表--解决Josephus问题
- C语言通过双向循环链表解决Josephus(约瑟夫)问题
- 循环链表解决约瑟夫环问题
- 单循环链表解决约瑟夫环问题
- 循环链表解决约瑟夫环问题
- 循环链表 CircleList的实现并解决约瑟夫环问题
- 约瑟夫(Josephus)问题的求解——利用循环链表
- C语言单向循环链表解决约瑟夫问题
- 利用数组模拟的链表解决Josephus问题
- 约瑟夫解决问题的循环链表
- 约瑟夫问题(Josephus问题)的递推O(n)解法、循环解法、单循环链表解法
- Josephus问题解决方法四(循环数组)
- 给定一个单链表,从链表返回一个随机节点的值。 每个节点必须具有相同的选择概率。 跟进: 如果这个链表非常大,而且它的长度不为人知呢? 你能解决这个问题,而不使用额外的空间?
- 循环链表解josephus问题
- 循环链表解决约瑟夫环问题
- 使用C#循环链表解决约瑟夫环的问题
- 双循环链表解决耶稣门徒问题
- josephus问题->不带头节点的循环链表
- [转]用单向循环链表解决约瑟夫环问题
- 不使用链表解决Josephus问题