数据结构实验报告(约瑟夫环)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》课程实验
实验报告
题目:Joseph问题求解算法的设计与实现专业:计算机科学与技术
班级:
姓名:
学号:
完成日期:
一、试验内容
约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
二、试验目的
掌握链表的基本操作:插入、删除、查找等运算,能够灵活应用链表这种数据结构。
三、流程图
//Joseph问题求解算法的设计与实现
#include
#include
struct list
{
int num,code;
struct list *next;
};
void main()
{
printf("Joseph问题求解算法的设计与实现\n \n");
int i,j,m=1;
int key; // 密码.
int n; //人数 .
list *p,*s,*head;
head=(list *)malloc(sizeof(list)); //为头结点分配空间.
p=head;
printf("输入人的总个数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{ key=rand() % 100;
printf("第%d个人的密码:%d\n",i,key);
s=p;
p=(list *)malloc(sizeof(list)); //创建新的结点.
s->next=p;
p->num=i;
p->code=key;
}
p->next=head->next;
p=head;
head=head->next;
free(p); //释放头结点.
p=head;
do{
printf("\n第%d号成员的密码为:%d",p->num,p->code); //输出链表.
p=p->next;
}while(p!=head);
printf("\n\n输入第一个报的数:\n");
scanf("%d",&key);
printf("\n出列顺序为:\n");
do
{ j=1; p=head;
while(j s=p; p=p->next; j++; } //报数过程. i=p->num; key=p->code; printf("%d:第%d号成员出列\n",m,i); m++; s->next=p->next; head=p->next; //重新定义head,下次循环的开始结点. free(p);// 释放已出列的结点. n--; //人数减一. }while(n>0); } 五、调试过程 调试过程中,曾出现过缺少分号、括号之类的错误,还出现过运算顺序颠倒,致使运算出现了错误,在经过仔细的检查并且向人请教,终于得出了正确结果. 六、结果分析 Joseph问题求解算法的设计与实现 输入人的总个数:5 第1个人的密码:41 第2个人的密码:67 第3个人的密码:34 第4个人的密码:0 第5个人的密码:69 第1号成员的密码为:41 第2号成员的密码为:67 第3号成员的密码为:34 第4号成员的密码为:0 第5号成员的密码为:69 输入第一个报的数: 6 出列顺序为: 1:第1号成员出列 2:第2号成员出列 3:第3号成员出列 4:第5号成员出列 5:第4号成员出列 Press any key to continue