数据结构实验报告——线性表(约瑟夫环)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.实验要求
【实验目的】
1、熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法
2、学习指针、模板类、异常处理的使用
3、掌握线性表的操作的实现方法
4、学习使用线性表解决实际问题的能力
【实验内容】
利用循环链表实现约瑟夫问题的求解。
约瑟夫问题如下:已知n个人(n>=1)围坐一圆桌周围,从1开始顺序编号。从序号为1的人开始报数,顺时针数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规则重复下去,直到所有人全部出列。请问最后一个出列的人的编号。
2. 程序分析
2.1 存储结构
存储结构:循环链表
2.2 关键算法分析
【设计思想】
由于约瑟夫问题本事具有循环的性质,采用循环链表
为了统一对表中任意结点的操作,循环链表不带头结点
【伪代码】
1、工作指针first,r,s,p,q初始化
2、输入人数(n)和报数(m)
3、循环n次,用尾插法创建链表
s=new Node;
s->data=i+1;
r->next=s;
r=s;
4、p=first->next; 计数器初始化k=0;
5、循环n-1次删除结点
当k 移动指针m-2次p=p->next; 删除p结点的后一结点q q=p->next; p->next=q->next; delete q; 指针p后移p=p->next; 计数器k++; 【复杂度】 for(int i=0;i { s=new Node; s->data=i+1; r->next=s; r=s; } 时间复杂度:O(n) while (k { for (int j=0;j p=p->next; q=p->next; p->next=q->next; delete q; p=p->next; k++; } 时间复杂度:O(n2) 算法的空间复杂度:O(n2) 2.3 其他(原代码) 3.程序运行结果