有 n 个人,按 1 到 n 编号,要求从第 s 个人开始循环报数,报到 m 时,此人出列,再从下一个人开始报 m个数,直到所有人出列。给出 n 个人出列的顺序。
#include "stdio.h"
typedef struct node{
int number; /*编号*/
struct node * next;
}LNode,*LinkList;
void CreatJoseph(LinkList *jsp,int n)
{
LinkList q=NULL,list=NULL;
int i;
printf("请输循环的个数:\n");
for(i=0;i<n;i++)
{
insertList(&list,q,i+1);
if(i==0)q=list;
else q=q->next;
}
q->next=list; //形成循环链表
*jsp=list; //jsp约瑟夫环的首地址
return;
}
void insertList(LinkList *list,LinkList q,int el)
{
LinkList p;
p=(LinkList)malloc(sizeof(LNode));
p->number=el;
if(!*list){
*list=p;
p->next=NULL;
}
else{
p->next=q->next;
q->next=p;
}
return;
}
void exJoseph(LinkList *jsp,int m)
{
LinkList p,q;
int i;
q=p=*jsp;
while(q->next!=p) q=q->next;
printf("---------------");
while(p->next!=p){
for(i=0;i<m-1;i++)
{ /*p指向要删除的结点,q指向p的前一个结点*/
q=p;
p=p->next;
}
q->next=p->next;
printf("%d\t",p->number);
free(p);
p=q->next;
}
printf("%d\t",p->number);
}
int main()
{
LinkList jsp;
int n,m;
printf("请输入约瑟夫环的人数\n");
scanf("%d",&n);
CreatJoseph(&jsp,n);
printf("输入报数的上限\n");
scanf("%d",&m);
exJoseph(&jsp,m);
getche();
return 0;
}