本题用到链表的建立,删除链表中的节点等知识:
#include <stdio.h>
#include <malloc.h>
#define NULL 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct Cnode
{ int ID;
struct Cnode *next;
}CNode;
CNode *joseph; /*定义一个全局变量 */
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 */
int Josephus(CNode *clist,int m,int n,int k)
{ int i;
CNode *p,*q;
if(m>n) return ERROR;/*起始位置错 */
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->data);/*输出应出列的结点 */
if(p->next==p)
p=NULL; /*删除一个结点 */
else { p->next=q->next;/*删除第K个节点*/
p=p->next;
free(q);/*这句很重要*/
}
} /* end while */
clist=NULL;
} /* end */
void main( )
{ int m,n,k,i;
CNode *clist;
clist=NULL;/*初始化clist */
printf("\n请输入围坐在圆桌周围的人数n:");
scanf("%d",&n);
printf("\n请输入次开始报数人的位置m:");
scanf("%d",&m);
printf("\n你希望报数到第几个数的人出列?");
scanf("%d",&k);
Create_clist(clist,n);/*创建一个有n个结点的循环链表clist */
printf("\n出列的顺序如下:\n");
Joseph(clist,m,n,k);
getch();
}/*main */
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。