《数据结构》实验指导(一)
更新时间:2024-04-06 03:34:01 阅读量: 综合文库 文档下载
- 数据结构实验指导书及答案推荐度:
- 相关推荐
实验一 线性表
一、 实验目的
线性表是最简单、最常用的基本数据结构,在实际问题中有着广泛的应用。通过本章的实验,巩固对线性表逻辑结构的理解,掌握线性表的存储结构及基本操作的实现,为应用线性表解决实际问题奠定良好的基础,并进一步培养以线性表作为数据结构解决实际问题的应用能力。
(1)掌握线性表的顺序存储结构; (2)验证顺序表及其基本操作的实现;
(3)掌握数据结构及算法的程序实现的基本方法。 (4)掌握线性表的链接存储结构; (5)验证单链表及其基本操作的实现;
(6)进一步掌握数据结构及算法的程序实现的基本方法。 二、实验示例学习——顺序表操作 实验要求:
(1)建立含有若干个元素的顺序表;
(2)对已建立的顺序表实现插入、删除、查找等基本操作。 实现提示:
首先定义顺序表的数据类型——顺序表类SeqList,包括题目要求的插入、删除、查找等基本操作,为便于查看操作结果,设计一个输出函数依次输出顺序表的元素。
const int MaxSize=10;
template
public:
SeqList( ){length=0;} //无参构造函数 SeqList(T a[ ], int n); //有参构造函数
void Insert(int i, T x); //在线性表中第i个位置插入值为x的元素 T Delete(int i); //删除线性表的第i个元素
int Locate(T x ); //按值查找,求线性表中值为x的元素序号 void PrintList( ); //遍历线性表,按序号依次输出各元素 private:
T data[MaxSize]; //存放数据元素的数组 int length; //线性表的长度 };
其次,建立含有n个数据元素的顺序表,即设计构造函数。算法如下: template
SeqList:: SeqList(T a[ ], int n) {
if (n>MaxSize) throw \参数非法\ for (i=0; i 最后,对建立的顺序表设计插入、删除、查找等基本操作的算法。 (1)插入算法 template 1 void SeqList::Insert(int i, T x) { if (length>=MaxSize) throw \上溢\ if (i<1 | | i>length+1) throw \位置\ for (j=length; j>=i; j--) data[j]=data[j-1]; //注意第j个元素存在数组下标为j-1处 data[i-1]=x; length++; } (2)删除算法 template if (length==0) throw \下溢\ if (i<1 | | i>length) throw \位置\ x=data[i-1]; for (j=i; j data[j-1]=data[j]; //注意此处j已经是元素所在的数组下标 length--; return x; } (3)查找算法 template for (i=0; i if (data[i]==x) return i+1; //下标为i的元素等于x,返回其序号i+1 return 0; //退出循环,说明查找失败 } 实验程序: // 以下为头文件,文件名为SeqList.h #ifndef SeqList_H #define SeqList_H const int MaxSize=100; //100只是示例性的数据,可以根据实际问题具体定义template public: SeqList( ){length=0;} //无参构造函数,创建一个空表 SeqList(T a[ ], int n); //有参构造函数 void Insert(int i, T x); //在线性表中第i个位置插入值为x的元素 T Delete(int i); //删除线性表的第i个元素 int Locate(T x); //按值查找,求线性表中值为x的元素序号 void PrintList( ); //遍历线性表,按序号依次输出各元素 private: T data[MaxSize]; //存放数据元素的数组 int length; //线性表的长度 }; 2 #endif // 以下为SeqList类中成员函数的定义部分,文件名为SeqList.cpp #include \ template SeqList if (n>MaxSize) throw \参数非法\; for (int i=0; i template void SeqList if (length>=MaxSize) throw \上溢\; if (i<1 || i>length+1) throw \位置\; for (int j=length; j>=i; j--) data[j]=data[j-1]; //注意第j个元素存在数组下标为j-1处 data[i-1]=x; length++; } template T SeqList if (length==0) throw \下溢\; if (i<1||i>length) throw \位置\; T x=data[i-1]; for (int j=i; j data[j-1]=data[j]; //注意此处j已经是元素所在的数组下标 length--; return x; } template int SeqList for (int i=0; i if (data[i]==x) return i+1 ; //下标为i的元素等于x,返回其序号i+1 return 0; //退出循环,说明查找失败 } template 3 void SeqList for (int i=0; i // 以下为主函数,所在文件名为SeqListMain.cpp #include void main( ) { int r[ ]={1, 2, 3, 4, 5}; SeqList cout<<\执行插入操作前数据为:\< a.Insert(2,3); } catch (char *s) { cout< cout<<\执行插入操作后数据为:\< cout< a.Delete(1); //删除元素1 } catch (char *s) { cout< cout<<\删除后数据为:\< a.PrintList( ); //输出所有元素 } 三、实验题目 4 题目1. 单链表操作 实验要求: (1)用头插法(或尾插法)建立带头结点的单链表; (2)对已建立的单链表实现插入、删除、查找等基本操作。 实现提示: 首先,将单链表中的结点定义为如下结构类型: template T data; Node }; 其次,定义单链表的数据类型——单链表类LinkList,包括题目要求的插入、删除、查找等基本操作,为便于查看操作结果,设计一个输出函数依次输出单链表的元素。 template public: LinkList(T a[ ], int n); //建立有n个元素的单链表 ~LinkList( ); //析构函数 void Insert(int i, T x); //在单链表中第i个位置插入元素值为x的结点 T Delete(int i); //在单链表中删除第i个结点 int Locate(T x); //求单链表中值为x的元素序号 void PrintList(); //遍历单链表,按序号依次输出各元素 private: Node 再次,设计单链表类LinkList的构造函数和析构函数。 (1)用头插法或尾插法建立单链表。头插法建立单链表的算法如下: template LinkList< T>:: LinkList(T a[ ], int n) { first=new Node first->next=NULL; //初始化一个空链表 for (i=0; i s=new Node (2)析构函数用于释放单链表中所有结点,算法如下: template LinkList< T>:: ~LinkList( ) { 5 p=first; //工作指针p初始化 while (p) //释放单链表的每一个结点的存储空间 { q=p; //暂存被释放结点 p=p->next; //工作指针p指向被释放结点的下一个结点,使单链表不断开 delete q; } } 最后,对所建立的单链表设计插入、删除、查找等基本操作的算法。 (1)插入算法 template void LinkList::Insert(int i, T x) { p=first; j=0; //工作指针p初始化 while (p && j p=p->next; //工作指针p后移 j++; } if (!p) throw \位置\ else { s=new Node (2)删除算法 template p=first ; j=0; //工作指针p初始化 while (p && j p=p->next; j++; } if (!p | | !p->next) throw \位置\ //结点p不存在或结点p的后继结点不存在 else { q=p->next; x=q->data; //暂存被删结点 p->next=q->next; //摘链 delete q; return x; } } (3)查找算法 template int LinkList< T>:: Locate(T x) { p=first->next; j=1; while (p && p->data!=x) 6 { p=p->next; //工作指针p后移 j++; } if (p) return j; else return 0; } 题目2:数组的循环移位 问题描述: 对于一个给定的整型数组循环左移i位。 基本要求: (1)在原数组中实现循环左移,不另外申请空间; (2)时间性能尽可能好; (3)分析算法的时间复杂度。 设计思想 将这个问题看作是把数组ab转换成数组ba(a代表数组的前i个元素,b代表数组中余下的n-i个元素),先将a逆置得到arb,再将b逆置得到arbr,最后将整个arbr逆置得到(arbr)r=ba。设Reverse函数执行将数组元素逆置的操作,对abcdefgh向左循环移动3个位置的过程如下: Reverse(0, i-1); //得到cbadefgh Reverse(i, n-1); //得到cbahgfed Reverse(0, n-1); //得到defghabc. 算法描述: 循环左移算法: void Converse(int A[ ], int n, int i) { Reverse(A, 0, i-1); //前i个元素逆置 Reverse(A, i, n-1); //后n-i个元素逆置 Reverse(A, 0, n-1); //整个数组逆置 } void Reverse(int A[ ], int from, int to) //将数组A中元素从from到to逆置 { for (i=0; i<(to-from+1)/2; i++) A[from+i]←→A[to-i]; //交换元素 } 题目3:约瑟夫环问题 问题描述: 约瑟夫问题的一种描述:编号为1,2,……,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数。 方法1.报数为m的人出列(将其删除),从他在顺时针方向上的下一个人开始重新从1报数,……,如此下去,直到所有人全部出列为止。试设计一个程序求出出列顺序。要求利用单向循环链表存储结构模拟此过程,按照出列的顺序打印出各人的编号和姓名。 方法2. 报m的人出列(将其删除),将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,……,如此下去,直到所有人全部出列为止。试设计一个程序求出出列顺序。要求利用 7 无头结点的单向循环链表存储结构模拟此过程,按照出列的顺序打印出各人的编号。 基本要求: 下面给出了方法1的程序作为示例,请编写方法2的程序并上机测试。 【方法1的程序清单】 #include struct NodeType // 结点的结构定义 { int num; // 编号子域 char name[20]; // 姓名子域 NodeType *next; // 指针域 }; class Jose //类声明 { private: NodeType *Head; public: Jose( ){ Head=new NodeType; // 为头结点申请空间 Head->next=Head; // 头结点Head 形成空环 }; ~Jose(){ }; void creat(); void outs(); }; void Jose::creat()// 建成约瑟夫环 { int i=0, n; NodeType *newp, *pre; pre= Head; cout<<\输入总人数 n=\; cin>>n; for(i=0;i { newp=new NodeType; // 申请数据元素结点空间 newp->num=i+1; // 结点送值(号码) cout<<\编号\<>newp->name; // 读入姓名 newp->next=Head; pre->next=newp; pre=newp; // 形成循环链表 } pre->next= Head->next; delete Head; // 删除附加头结点Head Head=pre->next; // 头指针指向第一个数据元素结点 } void Jose::outs( ) //约瑟夫问题的方法1 { int m,i; NodeType *q=Head, *p; cout<<\ 输入m值(m>=2)\; cin>>m; 8 cout<<\ 根据m值,开始报数输出:\< { for(i=1;i cout<<\编号:\< cout<<\编号:\< int main() { Jose h; h.creat(); return 0; } // 主函数 h.outs(); 9
正在阅读:
《数据结构》实验指导(一)04-06
交警纪律作风建设查摆剖析材料相关范文02-11
会声会影教程(超详细)06-11
公路高边坡防止措施09-22
三教知〔2012〕21号三台县教育局关于印发《三台县学校、幼儿园食06-21
更新的理念 更大的空间 更高的要求 学习新课程标准的点滴体会03-13
室外消防管道施工方案03-02
关于公务员纪律惩戒有关问题的通知人社部发〔2010〕59号01-24
庭审观摩手记02-11
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 数据结构
- 指导
- 实验
- 20160422第四届“魅力之光”知识竞赛初赛题库(296旧+200新) -
- 雅思口语必备动词短语
- 2006年1月至6月全国外语类学术期刊论文目录分类汇编
- 论语译注读书笔记
- AD使用技巧
- 江苏省2013年栟茶中学高三数学考前赢分30天 第15天
- 水性环氧防腐涂料项目可行性研究报告(发改立项备案+2013年最新
- 亿以上数的读法
- 关于村级组织换届选举的思考
- 分析化学试题1及答案
- 关于优秀学生干部应具备的素质的问卷调查
- 中南大学《网络教育与网络学习》课程作业(在线作业)一及参考答
- 小孔成像实验报告
- 滚动直线导轨安装工艺指导书
- 科技馆社会实践报告(马原) - 图文
- 混凝土裂缝的成因与防治
- 2016四川公务员笔试行测言语理解习题(2月15日)
- 银监发年第87号中国银行业监督管理委员会关于印发《商业银
- 2017年秋人教版八年级数学上第十五章分式单元测试含答案
- 检查通滩小学德育实践基地建设情况 钟华贵副区长到泸州十中调研