本页面主要目录有关于Josephus的:著名的Josephus问题、Josephus问题的C程序等介绍

著名的Josephus问题

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特後,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。

然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

Josephus问题的C程序

#include <malloc.h>

#include <stdio.h>

#include <stdlib.h>

#define FALSE 0

#define TRUE 1

typedef int DataType; /* 定义元素类型为整型,也可定义为其他类型 */

struct Node; /* 单链表结点类型 */

typedef struct Node *PNode; /* 结点指针类型 */

struct Node /* 单链表结点结构 */

{

DataType info;

PNode link;

};

struct LinkList /* 单链表类型定义 */

{

PNode head; /* 指向单链表中的第一个结点 */

};

typedef struct LinkList *PLinkList; /* 单链表类型的指针类型 */

int insert_clink( PLinkList pclist, DataType x, PNode p )

/* 在pclist所指的循环单链表中最后一个结点p的后面插入元素x */

{

PNode q;

Josephus

if(

Josephus

)

{

printf( "Out of space!!! \n" );

return ( FALSE );

}

else

{

Josephus

Josephus

;

Josephus

return ( TRUE );

}

}

PLinkList createNullList_clink( void )

/* 创建带头结点的空循环链表*/

{

PLinkList pclist;

PNode p;

Josephus

;

if(

Josephus

)

{

Josephus

; /* 申请头结点 */

if (

Josephus

)

{

Josephus

;

Josephus

;

}

else

Josephus

;

}

else

printf( "Out of space!!\n" );

return pclist;

}

PNode next_clink( PNode p )

{

return p->link;

}

PNode find_clink( PLinkList pclist, int i )

/* 在带有头结点的循环单链表clist中求第i(

Josephus

)个结点的位置 */

/* 当表为空循环单链表时,返回值为NULL */

{

PNode p;

int j;

Josephus

if (

Josephus

)

{

printf("The value ofis not reasonable.\n",i);

Josephus

return NULL;

}

if (

Josephus

)

return NULL;

for (

Josephus

)

Josephus

;

return p;

}

void josephus_clink( PLinkList pclist, int s,int m )

{

PNode p,pre,tp;

int i;

p = find_clink(pclist,s); /* 找第s个结点 */

if (

Josephus

/* 无第s个结点 */

{

printf("

Josephus

not exit.\n ",s);

exit(1);

}

while (pclist->head->link!=NULL)

{

for (

Josephus

) /* 找第m个结点 */

{

Josephus

;

Josephus

;

}

printf(" out element:

Josephus

\n",p->info); /* 输出该结点 */

if (

Josephus

) /* 当表中元素个数大于1时,删除该结点 */

{

Josephus

Josephus

Josephus

free(tp);

}

else /* 当表中元素个数等于1时,将头结点指针置空 */

{

free(pre);

Josephus

;

}

}

free(pclist->head);

free(pclist);

}

main( )

{

PLinkList jos_clist;

PNode p;

int i,n,s,m,k;

printf("\n please input the values of n = ");

Josephus

;

printf(" please input the values of s = ");

Josephus

;

printf(" please input the values of m = ");

Josephus

Josephus

; /* 创建空循环链表 */

if (

Josephus

) return ( FALSE);

Josephus

;

for(

Josephus

) /* 创建循环链表 */

{

Josephus

;

if

Josephus

) return(FALSE);

Josephus

;

}

josephus_clink(jos_clist,s,m);

return (TRUE);

}