数据结构约瑟夫环课程设计实验报告Word格式文档下载.docx
- 文档编号:15820705
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:10
- 大小:97.46KB
数据结构约瑟夫环课程设计实验报告Word格式文档下载.docx
《数据结构约瑟夫环课程设计实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构约瑟夫环课程设计实验报告Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
2.课程设计的要求和内容:
编号为1,2…n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止。
该题目要求用单循环链表作为存储结构,进行一个带密码的约瑟夫环的运算问题。
而且从键盘输入总人数、初始报数上限值m及各人密码,然后输出出列的人员的编号顺序。
按照题目的要求,要采用单循环链表来作为存储结构,然后在循环链表的基础上去实现约瑟夫环的运行。
在主函数里,定义完各项之后,我先用一个while的循环语句来实现能够反复进行运算。
关于约瑟夫环的运算,先创建一个只有头结点的空链表,然后输入总人数N,和初始的上限值M,用总人数N去初始化循环链表,然后在循环链表里面从键盘输入对应的密码值。
3.主要参考文献:
1、《算法与数据额结构C语言版》机械工业出版社陈守孔孟佳娜武秀川
2、《C语言程序设计》(第二版)清华大学出版社谭浩强
3、《数据结构》(C语言)版清华大学出版社严蔚敏吴伟民
4.课程设计进度计划(以天为单位):
起止日期
工作内容
备注
2011年6月20号
2011年6月21号至2011年6月22号
2011年6月23号
2011年6月24号
系统分析与设计阶段
程序编制与调试阶段
答辩和考核
设计报告和书写说明书
约瑟夫环分析与设计
对约瑟夫环进行编程
一、题目设计与分析……………………………………………………4
1.1问题描述………………………………………………………4
1.3各模块的伪码算法……………………………………………4
二、流程图…………………………………………………………5
三、源程序清单………………………………………………………6
四、调试过程、运行结果………………………………………………9
五、程序有待改进的地方………………………………………………10
六、设计收获和建议…………………………………………………10
一、题目设计与分析
1.1问题描述
关于这次题目的设计,根据题目的要求,主要用了一个单循环链表作为存储结构。
首先是进行一系列的定义结点,其中就有包括每个人的密码和编号。
然后有空链表的创建和循环链表的初始化。
在这里,我们将输入每个人密码的步骤放在循环链表的初始化里,在初始化链表时从键盘输入密码和直接给每个人进行编号,而不是在主函数中进行。
然后在主函数里面主要就是实现约瑟夫环的运行,从第一个开始,找到对应上限值的的人,然后输出编号,将头指针指向下一个结点,将该编号人员的密码赋值为新上限值,然后清空该结点的数据,一直这样的运行,直到所有结点都被清空,就完成了约瑟夫环的运行。
在设计的前期,本是设计将密码输入的这一部分放在主函数之中去执行,而建立单循环链表是单独的一个函数,但是无法实现将数据从主函数键入切能被准确使用,于是后改成在初始化链表的时候键入密码,从而达到目标。
1.2采用类c语言定义相关的数据类型
typedefstructNode
{
intpassword;
//每个人持有的密码
intnum;
//人员的编号
structNode*next;
//指向下一个节点
}Node,*Link;
1.3各模块的伪码算法
InitList(Link&
L)
操作结果:
构造一个空的线性表L
(Node*)malloc(sizeof(Node)
动态分配内存存储空间
Creater(intn,Link&
初始化链表,初始化人员编号和输入每个人的密码
Creater(n,L)
建立一个循环列表,赋予初始编号和输入每个人的密码,构成一个约瑟夫环
三、源程序清单
#include<
stdio.h>
stdlib.h>
voidInitList(Link&
L)
L=(Node*)malloc(sizeof(Node));
if(!
L)exit
(1);
L->
password=0;
num=0;
next=L;
}
voidCreater(intn,Link&
Linkp,q;
q=L;
for(inti=1;
i<
=n;
i++)
{
p=(Node*)malloc(sizeof(Node));
if(!
p)exit
(1);
printf("
请输入第%d个人的密码:
"
i);
scanf("
%d"
&
p->
password);
p->
num=i;
L->
next=p;
L=p;
}
next=q->
next;
free(q);
voidmain()
printf("
*********************约瑟夫环*********************\n"
);
LinkL,p,q;
intn,m;
inta=1;
intb=1;
while(b==1)
L=NULL;
InitList(L);
printf("
请输入总人数N:
\n"
scanf("
n);
while(n<
=1)
{
printf("
输入的总人数有误,请重新输入大于1的总人数:
\n"
scanf("
}
请输入初始的上限值M(正整数):
\n"
m);
while(m<
0)
输入上限值有误,请重新输入:
Creater(n,L);
最终出列的顺序为:
p=L;
for(inti=1;
i++)
for(intj=1;
j<
m;
j++)
{
p=p->
}
q=p->
m=q->
password;
%d"
q->
num);
p->
free(q);
是否继续重新输入运算(1.继续0.退出):
b);
\n\n\n"
四、调试过程、运行结果
基本界面,关于各项值和密码的输入。
然后得到正确的结果。
同时进行询问判断,是否继续。
如果选择继续,则可以重复输入各项继续进行运算。
如果不选择继续,则输入0后退出。
如果一开始输入的数据有错,则会提示输入的数据有错,要求重新输入。
如果输入的初始上限值有错。
也会进行提醒然后要求重新输出。
经过测试,正确地输入数据。
就能得出想要的约瑟夫环运算的结果。
五、程序有待改进的地方
运行环境下有待加强,因为程序只能在MICROSOFTVISUALC++6.0里面运行,对于其他运行软件却不能运行。
六、设计的收获和建议
在这次数据结构的课程设计中,让我进一步地了解单循环链表的用法,也更清楚地明白关于约瑟夫环的一些内容。
在设计的过程中,重点的问题有两个,一个是约瑟夫环该怎么样去实现,还有就是每个人的密码应该如何输入。
起初,密码的输入是设计在主函数中去解决,最后在查阅资料和动手实践过之后,决定将密码的输入放在循环链表的初始化过程中,这样的话,能够更条理清晰。
总的来说,关于这次课程设计,我受益不浅。
自己动手实践设计关于约瑟夫环,让我对数据结构有进一步的了解,虽然这次的设计只用到链表,没有用到其他结构,但是也对它们有了更深的理解。
课程设计,锻炼的是我们的思维能力和动手能力,在今后,我会继续保持自主性的学习和实践,更深入地去学习和应用关于数据结构的知识。
指导教师签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 约瑟夫 课程设计 实验 报告