数据结构实验报告——线性表(约瑟夫环)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.程序运行结果

相关文档
最新文档