#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;
};
typedef struct Node *LinkList;
typedef LinkList *PLinkList;
int main()
{
LinkList jos_clist;
int n,s,m; /*输入所需各参数的值*/
do
{
printf("\n请输入几人参与: n=");
scanf("%d",&n);
}while(n<1);
do
{
printf("\n请输入第几人开始报数人: s=");
scanf("%d",&s);
}while(s<1);
do
{
printf("\n请输入报数第几人后出列: m=");
scanf("%d",&m);
}while(m<1);
if(init_clist(&jos_clist,n))
josephus_clist(&jos_clist,s,m);
else
printf("出列的人!\n");
return 0;
}
int init_clist(PLinkList pclist,int n)
/*用1,2,...,n为*pclist所示的循环表初始化*/
{
PNode p,q;
int i;
q=(PNode)malloc(sizeof(struct Node));
if(q==NULL) return FALSE;
*pclist=q;
q->info=1;
q->link=q;
if(n==1) return TRUE;
for(i=2;i<n+1;i++)
{
p=(PNode)malloc(sizeof(struct Node));
if(p==NULL) return FALSE;
p->info=i;
p->link=q->link;
q->link=p;
q=p;
}
return TRUE;
}
void josephus_clist(PLinkList pclist,int s,int m)
{
PNode p,pre;
int i;
p=*pclist;
/*找第s个元素*/
if(s==1)
{
pre=p;
p=p->link;
while(p!=*pclist)
{
pre=p;
p=p->link;
}
}
else
for(i=1;i<s;i++)
{
pre=p;
p=p->link;
}
while(p!=p->link)/*当链表中结点个数大于1时*/
{
for(i=1;i<m;i++)/*找第m个结点*/
{
pre=p;
p=p->link;
}
printf("\n出列的人是:%d\n",p->info);/*输出该结点*/
if(*pclist==p)/*该结点是第一个结点时,删除时需特殊处理一下*/
*pclist=p->link;
pre->link=p->link;/*删除该结点*/
free(p);
p=pre->link;
}
printf("\n出列的人是:%d\n",p->info);/*输出最后一个结点*/
*pclist=NULL;
free(p);
}
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
typedef int DataType;/*定义元素类型为整型,也可以定义为其他类型*/
struct Node;/*单链表结点类型*/
typedef struct Node *PNode;/*结点指针类型*/
struct Node/*单链表结点结构*/
{
DataType info;
PNode link;
};
typedef struct Node *LinkList;
typedef LinkList *PLinkList;
int main()
{
LinkList jos_clist;
int n,s,m; /*输入所需各参数的值*/
do
{
printf("\n请输入几人参与: n=");
scanf("%d",&n);
}while(n<1);
do
{
printf("\n请输入第几人开始报数人: s=");
scanf("%d",&s);
}while(s<1);
do
{
printf("\n请输入报数第几人后出列: m=");
scanf("%d",&m);
}while(m<1);
if(init_clist(&jos_clist,n))
josephus_clist(&jos_clist,s,m);
else
printf("出列的人!\n");
return 0;
}
int init_clist(PLinkList pclist,int n)
/*用1,2,...,n为*pclist所示的循环表初始化*/
{
PNode p,q;
int i;
q=(PNode)malloc(sizeof(struct Node));
if(q==NULL) return FALSE;
*pclist=q;
q->info=1;
q->link=q;
if(n==1) return TRUE;
for(i=2;i<n+1;i++)
{
p=(PNode)malloc(sizeof(struct Node));
if(p==NULL) return FALSE;
p->info=i;
p->link=q->link;
q->link=p;
q=p;
}
return TRUE;
}
void josephus_clist(PLinkList pclist,int s,int m)
{
PNode p,pre;
int i;
p=*pclist;
/*找第s个元素*/
if(s==1)
{
pre=p;
p=p->link;
while(p!=*pclist)
{
pre=p;
p=p->link;
}
}
else
for(i=1;i<s;i++)
{
pre=p;
p=p->link;
}
while(p!=p->link)/*当链表中结点个数大于1时*/
{
for(i=1;i<m;i++)/*找第m个结点*/
{
pre=p;
p=p->link;
}
printf("\n出列的人是:%d\n",p->info);/*输出该结点*/
if(*pclist==p)/*该结点是第一个结点时,删除时需特殊处理一下*/
*pclist=p->link;
pre->link=p->link;/*删除该结点*/
free(p);
p=pre->link;
}
printf("\n出列的人是:%d\n",p->info);/*输出最后一个结点*/
*pclist=NULL;
free(p);
}