/* HELLO.C -- Hello, world */
/******************************************************************************/
/*用链表实现jesophu问题*/
/******************************************************************************/
/*头文件的定义声明*/
/******************************************************************************/
#include "stdio.h"
#include "conio.h"
#include<malloc.h>
#define NULL 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
/******************************************************************************/
/*定义一个结点,含有ID和NEXT指针*/
typedef struct Cnode
{
int ID;
struct Cnode *next;
}CNode;
CNode *joseph; /*定义一个全局变量*/
/*****************************************************************************/
/*创建函数Create_clist()*/
int Create_clist(CNode *clist,int n) /*创建包含N个节点的循环链表*/
{
CNode *p,*q;
int i;
clist=NULL;
for(i=n;i>=1;i--)
{
p=(CNode *)malloc(sizeof(CNode));
if(p==NULL)
{
return OVERFLOW; /*存储分配失败*/
}
p->ID=i;
p->next=clist;
clist=p;
if(i==n)
q=p; /*用q指向链表的最后一个结点*/
}
q->next=clist; /*把链表的最后一个结点的链域指向链表的第一个结点,构成循环链表*/
joseph=clist;/*用创建好的循环链表头指针赋给全局变量*/
return OK;
} /*end*/
/*end Create_list()*/
/*****************************************************************************/
/*创建函数Joseph()*/
int Joseph(CNode *clist,int m,int n,int k)
{
int i;
CNode *p,*q;
if(m>n)
{
return ERROR; /*起始位置错*/
printf("\nm cannot > n !\n");
}
if(!Create_clist(clist,n))
return ERROR; /*循环链表创建失败*/
p=joseph; /*p指向创建好的循环链表*/
for(i=1;i<m;i++)
p=p->next; /*p指向m位置的结点*/
while(p) /*当p不为空时,执行循环*/
{
for(i=1;i<k-1;i++)
p=p->next;/*找出第k个结点q*/
q=p->next;
printf("%d",q->ID); /*输出应出列的结点*/
if(p->next==p)
p=NULL;/*删除最后一个结点*/
else {
p->next=q->next;/*删除第K个节点*/
p=p->next;
free(q);
}
} /*end while*/
clist=NULL;
}
/*end Joseph()*/
/**************************************************************************/
/*函数main()*/
void main()
{
int m,n,k,i;
CNode *clist;
clist=NULL; /*初始化clist*/
printf("\nPlease enter the number of all people!\nn=\n");
scanf("%d",&n);
printf("\nPlease enter the number of people who will start first!\nm= \n");
scanf("%d",&m);
printf("\nWho do you want to leave the table!\nk=\n");
scanf("%d",&k);
Create_clist(clist,n);/*创建一个有N个结点的循环链表clist*/
printf("\nThe result is that:\n");
Joseph(clist,m,n,k);
getch();
}
/*end main*/
/***************************************************************************/
|