ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:22.38KB ,
资源ID:9552886      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9552886.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构实验4.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构实验4.docx

1、数据结构实验4数据结构实验指导书重庆邮电大学软件工程学院范时平2014年10月实验目的与要求一、实验目的数据结构是软件工程学科中一门非常重要的专业基础课程。当用计算机来解决实际问题时,就要涉及到数据的存储表示及数据的处理,而数据存储表示及数据处理正是数据结构课程的主要研究对象,通过这两方面内容的学习,为后续课程,特别是为软件方面的课程打下厚实的知识基础,同时也提供了必要的技能训练。因此,数据结构在软件工程学科及相关学科专业的课程体系中具有极其重要的作用。本课程的任务是:通过实践,学生对常用数据结构的基本概念及其不同的实现方法的理论得到进一步的掌握,并对在不同存储结构上实现不同的运算方式和技巧有

2、所体会;能够快速确定数据的逻辑结构、并根据数据处理的类型和频度选择最佳的存储结构和算法组合。二、实验要求1准备好上机所需要的C+程序,以提高上机效率。对程序中自己有疑问的地方应作记号,以便在上机时给予注意或获取教师指导。不得抄袭他人程序。2上机输入并调试/运行所编写程序。3上机结束后,提交实验报告,实验报告应包括但不限于以下内容:(1)题目;(2)实验目的;(3)主要数据结构描述;(4)算法的基本思想描述;(5)算法时间复杂度分析;(6)运行的结果截图;(7)实验体会和收获;(8)程序清单。实验一 顺序表的存储与操作一、实验目的1理解线性表的逻辑结构;2理解顺序表的存储结构特点,掌握顺序表的存

3、储分配要点;3掌握顺序表的基本操作及实现,并能正确分析其时间复杂度。二、实验内容1. 定义顺序表的存储结构;2. 顺序表的基本操作(1)初始化顺序表(无参和有参);(2)求顺序表长度;(3)按位置查找;(4)按值查找;(5)在位置i插入一个数据元素;(6)删除位置i的数据元素;(7)遍历顺序表;(8)销毁顺序表。三、算法思想和时间复杂度当我们要在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表的第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。若要删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。四、参考代码1. 顺序表的存储结

4、构和操作接口SeqList.h 声明类SeqList,文件名为SeqList.h#ifndef SeqList_H#define SeqList_Hconst int MaxSize=100; /100只是示例性的数据,可以根据实际问题具体定义template /定义模板类SeqListclass SeqListpublic: SeqList( ); /无参构造函数 SeqList(T a, int n); /有参构造函数 SeqList(); /析构函数为空 int Length(); /求线性表的长度 T Get(int i); /按位查找,取线性表的第i个元素 int Locate(T

5、x); /按值查找,求线性表中值为x的元素序号 void Insert(int i, T x); /在线性表中第i个位置插入值为x的元素 T Delete(int i); /删除线性表的第i个元素 void PrintList(); /遍历线性表,按序号依次输出各元素private: T dataMaxSize; /存放数据元素的数组 int length; /线性表的长度;#endif2. 顺序表操作的实现/SeqList.cpp #include SeqList.h/*前置条件:顺序表不存在*输 入:无*功 能:构建一个顺序表*输 出:无*后置条件:构建一个顺序表*/template Se

6、qList: SeqList( ) length=0;/*前置条件:顺序表不存在*输 入:顺序表信息的数组形式a,顺序表长度n*功 能:将数组a中元素建为长度为n的顺序表*输 出:无*后置条件:构建一个顺序表*/template SeqList: SeqList(T a, int n) if (nMaxSize) throw 参数非法; for (int i=0; in; i+) datai=ai; length=n;/*前置条件:无*输 入:无*功 能:无*输 出:无*后置条件:无*/template SeqList: SeqList( )/*前置条件:顺序表存在*输 入:插入元素x,插入位

7、置i*功 能:将元素x插入到顺序表中位置i处*输 出:无*后置条件:顺序表插入新元素*/template void SeqList:Insert(int i, T x) int j; if (length=MaxSize) throw 上溢; if (ilength+1) throw 位置; for (j=length; j=i; j-) dataj=dataj-1; /注意第j个元素存在数组下标为j-1处 datai-1=x; length+;/*前置条件:顺序表存在*输 入:要删除元素位置i*功 能:删除顺序表中位置为i的元素*输 出:无*后置条件:顺序表删除元素*/template T

8、SeqList:Delete(int i) int x,j; if (length=0) throw 下溢; if (ilength) throw 位置; x=datai-1; for (j=i; jlength; j+) dataj-1=dataj; /注意此处j已经是元素所在的数组下标 length-; return x;/*前置条件:顺序表存在*输 入:无*功 能:输出顺序表长度*输 出:顺序表长度*后置条件:顺序表不变*/template int SeqList:Length() return length;/*前置条件:顺序表存在*输 入:查询元素位置i*功 能:查找位置为i的元素并

9、输出值*输 出:查询元素的值*后置条件:顺序表不变*/template T SeqList:Get(int i) if (ilength) throw 查找位置非法; else return datai-1;/*前置条件:顺序表存在*输 入:查询元素值x*功 能:按值查找值的元素并输出位置*输 出:查询元素的位置*后置条件:顺序表不变*/template int SeqList:Locate(T x) for (int i=0; ilength; i+) if (datai=x) return i+1 ; /下标为i的元素等于x,返回其序号i+1 return 0; /退出循环,说明查找失败/

10、*前置条件:顺序表存在*输 入:无*功 能:顺序表遍历*输 出:输出所有元素*后置条件:顺序表不变*/template void SeqList:PrintList() for(int i=0;ilength;i+) coutdataiendl;3. 顺序表的调试运行/SeQListMain.cpp#include /引用输入输出流库函数的头文件#include SeqList.cpp /引用顺序表类SeqListvoid main( ) SeqLista; /创建一个空的顺序表 cout执行插入操作:endl; try a.Insert(1,1); a.Insert(2,3); a.Inse

11、rt(3,4); catch(char* wrong) cout wrong; /如失败提示失败信息 cout已经插入“1,3,4”endl; coutendl; cout顺序表a的长度为:; couta.Length()endl; /返回单链表长度 coutendl; cout按位查询第二个元素:endl; cout第二个元素为:; cout a.Get(2)endl; /查找顺序表中第二个元素 coutendl; cout按值查询3:endl; cout值为3的元素位置为:; couta.Locate(3)endl; /查找元素3,并返回在单链表中位置 coutendl; try if(a

12、.Length() cout执行删除第一个元素操作:endl; coutendl; a.Delete(1); /删除元素1 cout已删除成功,顺序表a的长度为:; couta.Length()endl; else cout顺序表a长度为0endl; catch(char* wrong) cout wrong; /如失败提示失败信息 coutendl; cout顺序表a中的元素有:endl; a.PrintList(); /输出所有元素 int r=1,2,3,4,5; SeqList b(r,5); /根据数组创建顺序表 cout执行插入操作前顺序表b为:endl; b.PrintList(

13、); /输出顺序表所有元素 cout插入前顺序表b的长度为:; coutb.Length()endl; try b.Insert(3,8); catch(char* wrong) cout wrong; /如失败提示失败信息 cout执行插入操作后顺序表b为:endl; b.PrintList(); /输出顺序表b所有元素 cout插入后顺序表b的长度为:; coutb.Length()endl; coutendl; try if(a.Length() cout执行删除第一个元素操作:endl; coutendl; b.Delete(1); /删除b中第一个元素 cout已删除成功,顺序表b的

14、长度为:; coutb.Length()endl; else cout顺序表b长度为0endl; catch(char* wrong) cout wrong; /如失败提示失败信息 cout执行插入操作后顺序表b为:endl; b.PrintList(); /输出顺序表所有元素实验二 单链表的存储与操作一、实验目的1理解线性表的逻辑结构;2理解单链表的存储结构特点,掌握单链表的存储分配要点;3掌握单链表的基本操作及实现,并能正确分析其时间复杂度。二、实验内容1. 定义单链表的存储结构;2. 单链表的基本操作(1)初始化单链表(无参和有参);(2)求单链表长度;(3)按位置查找;(4)按值查找;

15、(5)在位置i插入一个数据元素;(6)删除位置i的数据元素;(7)遍历单链表;(8)销毁单链表。三、算法思想和时间复杂度1. 按位置/值查找:顺序查找,平均时间复杂度为O(n);2. 在位置i插入一个数据元素:在序号为i-1的结点后插入结点,平均时间复杂度为O(n);3. 删除位置i的数据元素:删除序号为i-1结点的后继结点,平均时间复杂度为O(n);4. 初始化单链表(有参):有前插法和尾插法(注意单链表的逻辑关系应与参数数组保持一致),时间复杂度为O(n);5. 遍历单链表、求单链表长度、销毁单链表:顺序处理,时间复杂度为O(n)。四、参考代码1. 单链表的存储结构和操作接口/LinkLi

16、st.h 声明类LinkList#ifndef LinkList_H#define LinkList_Htemplate struct Node T data; Node *next; /此处也可以省略;template class LinkList public: LinkList( ); /建立只有头结点的空链表 LinkList(T a , int n); /建立有n个元素的单链表 LinkList(); /析构函数 int Length(); /求单链表的长度 T Get(int i); /取单链表中第i个结点的元素值 int Locate(T x); /求单链表中值为x的元素序号 v

17、oid Insert(int i, T x); /在单链表中第i个位置插入元素值为x的结点 T Delete(int i); /在单链表中删除第i个结点 void PrintList( ); /遍历单链表,按序号依次输出各元素 private: Node *first; /单链表的头指针;#endif2. 单链表操作的实现/LinkList.cpp#include LinkList.h/*前置条件:单链表不存在*输 入:无*功 能:构建一个单链表*输 出:无*后置条件:构建一个单链表*/template LinkList: LinkList( ) first=new Node; first-n

18、ext=NULL;/*前置条件:单链表不存在*输 入:顺序表信息的数组形式a,单链表长度n*功 能:将数组a中元素建为长度为n的单链表*输 出:无*后置条件:构建一个单链表*/ template LinkList: LinkList(T a , int n) first=new Node; /生成头结点 Node *r,*s; r=first; /尾指针初始化 for (int i=0; in; i+) s=new Node; s-data=ai; /为每个数组元素建立一个结点 r-next=s; r=s; /插入到终端结点之后 r-next=NULL; /单链表建立完毕,将终端结点的指针域置

19、空 /*前置条件:无*输 入:无*功 能:无*输 出:无*后置条件:无*/template LinkList: LinkList()/*前置条件:单链表存在*输 入:查询元素位置i*功 能:按位查找位置为i的元素并输出值*输 出:查询元素的值*后置条件:单链表不变*/template T LinkList:Get(int i) Node *p; int j; p=first-next; j=1; /或p=first; j=0; while (p & jnext; /工作指针p后移 j+; if (!p) throw 位置; else return p-data;/*前置条件:单链表存在*输 入

20、:查询元素值x*功 能:按值查找值的元素并输出位置*输 出:查询元素的位置*后置条件:单链表不变*/template int LinkList:Locate(T x) Node *p; int j; p=first-next; j=1; if(p&p-next) while(p-data!=x) p=p-next; j+; return j; else throw 位置; /*前置条件:单链表存在*输 入:插入元素x,插入位置i*功 能:将元素x插入到单链表中位置i处*输 出:无*后置条件:单链表插入新元素*/template void LinkList:Insert(int i, T x)

21、Node *p; int j; p=first ; j=0; /工作指针p初始化 while (p & jnext; /工作指针p后移 j+; if (!p) throw 位置; else Node *s; s=new Node; s-data=x; /向内存申请一个结点s,其数据域为x s-next=p-next; /将结点s插入到结点p之后 p-next=s; /*前置条件:单链表存在*输 入:无*功 能:输出单链表长度*输 出:单链表长度*后置条件:单链表不变*/template int LinkList:Length( ) Node *p = first-next; int i = 0

22、; while(p) p = p-next; i+; return i;/*前置条件:单链表存在*输 入:要删除元素位置i*功 能:删除单链表中位置为i的元素*输 出:无*后置条件:单链表删除元素*/template T LinkList:Delete(int i) Node *p; int j; p=first ; j=0; /工作指针p初始化 while (p & jnext; j+; if (!p | !p-next) throw 位置; /结点p不存在或结点p的后继结点不存在 else Node *q; int x; q=p-next; x=q-data; /暂存被删结点 p-next

23、=q-next; /摘链 delete q; return x; /*前置条件:单链表存在*输 入:无*功 能:单链表遍历*输 出:输出所有元素*后置条件:单链表不变*/template void LinkList:PrintList( ) Node *p; p=first-next; while (p) coutdatanext; 3. 调试运行/LinkListMain.cpp#include /引用输入输出流库函数的头文件#include LinkList.cpp /引用单链表的类void main( ) LinkList a; cout执行插入操作:endl; try a.Insert

24、(1,4); a.Insert(2,5); a.Insert(3,6); catch(char* wrong) cout wrong; /如失败提示失败信息 cout已经插入“4,5,6”endl; cout单链表a的长度为:endl; couta.Length()endl; /返回单链表长度 coutendl; cout单链表a的元素为:endl; a.PrintList(); /显示链表中所有元素 coutendl; cout按位查找第二个元素:endl; cout第二个元素为:; couta.Get(2)endl; /查找链表中第二个元素 coutendl; cout按值查找5endl;

25、 cout值为5的元素位置为:; couta.Locate(5)endl; /查找元素5,并返回在单链表中位置 coutendl; cout执行删除4的操作endl; a.Delete(1); /删除元素4 cout已删除成功,单链表a的长度为; couta.Length()endl; coutendl; cout链表a中的元素为:endl; a.PrintList(); int r =1,2,3,4,5; LinkList b(r,5); /根据数组创建单链表 cout执行插入操作前单链表b为:endl; b.PrintList(); /输出单链表所有元素 cout插入前单链表b的长度为:; coutb.Length()endl; try b.Insert(3,8); catch(char* wrong) cout wrong; /如失败提示失败信息 cout执行插入操作后单链表b为:endl; b.PrintList(); /输出单链表b所有元素 cout插入后单链表b的长度为:; coutb.Length()endl; coutendl; try

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1