采用链表解决约瑟夫问题:有n个人围坐在一起形成头尾相接的一个环,从第m个人开始报数,每次有人数到r时,这个人就离开。请输出所有人的离队顺序。 #include "stdafx.h" # include<stdio.h> # include<malloc.h> # define LEN sizeof(struct people) struct people //定义结构体people { int num; struct people *next; }; struct people *creat(int n) //创建节点,并按在节点赋值以作为节点序号 { struct people *p; p=(struct people *) malloc(LEN); p->num=n; return(p); } void main() { struct people *p,*head,*p1; //p指针为创建指针;head指向num=0节点;p1为实际运算时所用指针 int num,jump,start,i,j=1; printf("/n********************************* Josephus问题 *********************************/n"); printf("请输入参与人数:/n"); scanf("%d",&num); printf("请输入间隔数:/n"); scanf("%d",&jump); printf("请输入从第几人开始:/n"); scanf("%d",&start); while(num<1||jump<1||start<1) //防止输入出错,增强强壮性 { getchar(); printf("输入人数有误,请重新输入:/n"); printf("请输入参与人数:/n"); scanf("%d",&num); printf("请输入间隔数:/n"); scanf("%d",&jump); printf("请输入从第几人开始:/n"); scanf("%d",&start); } head=p=creat(1); //给head和p赋初值 for(i=2;i<=num;i++) //根据输入的num数,创建num个节点 { p->next=creat(i); p=p->next; } p->next=head; //将最后一个节点的next指向head,使链表成环 for(i=1;i<start;i++) //根据输入的Start数,将p向后移Start-1位,将值给p1 p=p->next; p1=p; //将p1指向要开始计数的前一个节点 printf("结果排序如下:/n"); if(num!=1) { do //当num不为1时,p1每向后移一位,j的值增加一位 { if(jump==1) //当junp=1时顺序输出各数 { printf("%d/t",p1->next->num); p1->next=p1->next->next; j=1; } else { p1=p1->next; j++; if(j==jump) //当j的值等于jump值时,输出p1指向的下一个节点的num值,并将p1的下一个节点跳过,j重新计数 { printf("%d/t",p1->next->num); p1->next=p1->next->next; j=1; } } }while(p1->next!=p1); //当p1指向节点的next等于它本身时,循环结束 } printf("%d/n",p1->num); }