- 24
- 0
- 约9.73千字
- 约 13页
- 2020-08-19 发布于湖北
- 举报
数据结构实验报告
实验名称: 实验一——线性表
学生姓名:
班 级:
班内序号:
学 号:
日 期:
1.实验要求
实验目的
熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法
学习指针、模板类、异常处理的使用
掌握线性表的操作的实现方法
学习使用线性表解决实际问题的能力
实验内容
利用循环链表实现约瑟夫问题的求解。
约瑟夫问题如下:已知n个人(n=1)围坐一圆桌周围,从1开始顺序编号。从序号为1的人开始报数,顺时针数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规则重复下去,直到所有人全部出列。请问最后一个出列的人的编号。
2. 程序分析
2.1 存储结构
采用单循环链表实现约瑟夫问题的求解1
1
2
N
……
单循环链表存储结构示意图
2.2 关键算法分析
基本思想:
首先,应该确定构造链表时所用的插入方法。当数到m的那个人就出列,也即删除这个节点,同时建立这个节点的前节点与后节点的联系。由于是循环计数,所以才采用循环列表方式。
其次还要考虑输入值异常的情况。
之后,就是关于出列节点的逻辑判断。依次找到待删结点的直接前驱,便于删除结点后修改它的直接后继,如此循环直到最后一个人出列。
关键算法:
最后一个数据指向头指针,形成循环链表
head=new Node; //确定头结点
p=head;
for(i=1;i=n-1;i++) //赋初值
{
p-data=i;
p-next=new Node; //为下一个新建内存
p=p-next;
}
p-data=n; //最后一个单独处理
p-next=head; //指向头,形成循环链表
p=head;
输入值异常的情况
cout请输入环内总人数n:;
cinn;
if (n1) //考虑n输入错误的情况
{
coutn值输入错误endl;
}
cout请输入起始人号码:;
cink;
if (k1||kn) //考虑k输入异常的情况
{
coutk值输入错误endl;
}
cout请输入m值:;
cinm;
if (m1) //考虑m输入异常的情况
{
coutm值输入错误endl;
}
在约瑟夫环中实现逐个出环并找出最后一个出环的序号
while(p!=p-next)
{
for(i=1;im-1;i++) //查找q的节点
p=p-next;
q=p-next;
cout第s个出环的人编号是:q-dataendl;
p-next=q-next;
p=p-next;
delete q; //释放q的空间
s++;
}
cout最后环内留下的人编号是:p-dataendl;
delete p;
算法步骤:
从第一个结点开始,查找第i-1个元素,设为p指向该结点;
设q指向第i个元素:q = p-next;,输出q元素的数据;
摘链,即将q元素从链表中摘除:
p-next = q-next;
p=p-next;
delete q;
3. 程序运行结果
测试主函数流程:流程图如图所示
是输入n,k,m, m输入正确请按任意键继续
是
输入n,k,m
,
m
输入正确
请按任意键继续
否
初始化循环链表
是
开始
移动工作指针p,找到目标结点
输出数据,删除结点,n= n-1
输出数据,删除结点,n= n-1
结束否输出最后一个出列的编号n1
结束
否
输出最后一个出列的编号
n1
2、程序运行结果
3、输入错误运行结果
4. 总结
在调试程序过程中,虽然没有编译错误,但是运行结果总是和准确值差1,最后发现是把i=1写成i=0,才造成的错误,改过之后就没有问题了。
数据结构为我们提供有效算法,我们需要好好理解其中的每一段算法以便我们运用数据结构的知识解决复杂的问题。数据结构是我们学好编程的好助手。
下一步,应该运用模版相关知识,改进程序,使程序更具有可行性与规范性。
下面是余秋雨经典 励志语录,欢迎阅读。
原创力文档

文档评论(0)