您的位置:首页 > 其它

Josephus问题的一种解法(链表实现)

2016-10-30 15:38 417 查看
这里并不是原始的Josephus问题,而是其“通用版”,而历史上的那个只是个特殊情况

下面直接给代码:

#include <stdio.h>
#include <stdlib.h>
struct People;
typedef struct People *PtrToPeople;
struct People
{
int Position;
PtrToPeople Next;
};
typedef PtrToPeople Curcle;
typedef PtrToPeople Position;
void Insert(Position P,int e)
{
Position TmpCell;
TmpCell = malloc(sizeof(struct People));
TmpCell->Position = e;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
Position FindPre(Position P)
{
Position T = P;
for(;;)
if(T->Next == P)
return T;
else
T = T->Next;
}
Position DeleteAndPrint(Position P)
{
printf("%d ",P->Position);
Position T = FindPre(P);
T->Next = P->Next;
free(P);
return T->Next;
}
/* 输出被选中的,剩下最后一个是winner */
int main()
{
int N,M,i;
/* N表示总数,M表示跳格数 */
scanf("%d%d",&M,&N);

Curcle C = malloc(sizeof(struct People));
C->Position = 1;
C->Next = C;
for(i = 2; i <= N; i++)
{
Insert(C,i);
C = C->Next;
}
Position P = C->Next;
for(;;)
{
int j;
for(j = 0; j < M; j++)
{
P = P->Next;
}
if( P->Next == P )
{
break;
}
else
P = DeleteAndPrint(P);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct 链表 Josephus