我在大二上学期期末时候写的,大概2014年1月2号左右。我写在博客里一是为我以后复习所用,二是希望对需要的人有所帮助。
问题描述:
约瑟夫换是一个数学的应用问题:已知n个人(以编号1,2,3···n分别表示)围坐在一张桌子周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依次规律重复下去,直到圆桌周围的人全部出列。按照出列的顺序输出各个人的编号。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node{
int num;
struct Node *next;
}Node,*LinkList;
/*构造人链表*/
void InitRing(int n,LinkList &R)
{
LinkList p,q;
p=R;
for(int i=1;i<n;i++)
{
q=(LinkList)malloc(sizeof(Node));
q->num=i;
p->next=q;
p=q;
}
R->num=n;
p->next=R;
R=R->next;
printf("构造成功!\n\n");
}
/*遍历*/
void Display(int n,int k,LinkList &R)
{
LinkList p;
p=R;
int j=0;
for(int i=0;i<k-1;i++)
p=p->next;
while(j<n-1)
{
printf("%d-->",p->num);
p=p->next;
j++;
}
printf("%d\n",p->num);
printf("遍历完毕!\n\n");
}
/*把数到的人出队列*/
void DeleteDeath(int n,int m,int k,LinkList &R)
{
LinkList p,q;
p=R;
for(int i=0;i<k-2;i++)
p=p->next;
for(int j=0;j<n;j++)
{
for(int k=0;k<m-1;k++)
p=p->next;
printf("%d ",p->next->num);
q=p->next;
p->next=q->next;
free(q);
}
printf("\n所有人按序号出队列顺序一输出完毕!\n\n");
}
//退出模块
void Tuichu()
{
printf("谢谢使用!\n");
}
int main()
{
LinkList R;
R=(LinkList)malloc(sizeof(Node));
R->next=NULL;
int n,m,k;
printf("请输入总人数:");
scanf("%d",&n);
if(n<=0)
{
printf("输入有误,请输入正确人数数字!\n");
exit(0);
}
printf("请输入开始报数人的编号:");
scanf("%d",&k);
if(k<=0)
{
printf("输入有误,请输入正确数字!\n");
exit(0);
}
printf("请输入分隔的数:");
scanf("%d",&m);
if(m<=0)
{
printf("输入有误,请输入正确数字!\n");
exit(0);
}
while(1)
{
printf("------------------- 主菜单 -------------\n");
printf("---构造所有人的循环链表 请输入: 1 ----------\n");
printf("---输出开始遍历的链顺序 请输入: 2 ----------\n");
printf("---输出所有人出队列顺序 请输入: 3 ----------\n");
printf("---退出 请输入: 0 ----------\n");
int choice;
printf("请输入您的选择:");
scanf("%d",&choice);
if(choice>3||choice<0)
{
printf("请输入0~3之间的数,请重新输入!\n");
continue;
}
switch(choice)
{
case 1: InitRing(n,R);
break;
case 2: Display(n,k,R);
break;
case 3: DeleteDeath(n,m,k,R);
break;
case 0: Tuichu();
exit(0);
}
}
return 0;
}
6.测试结果
6.1输入部分用户界面
图6.1输入部分用户界面
6.2生成部分用户界面
图6.2 生成部分用户界面
6.3遍历部分用户界面
图6.3 遍历部分用户界面
6.4输出部分用户界面
图6.4 输出部分用户界面
6.5退出部分用户界面
图6.5 退出部分用户界面