数据结构实验报告三线性表的链式存储.docx
- 文档编号:23254783
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:17
- 大小:17.83KB
数据结构实验报告三线性表的链式存储.docx
《数据结构实验报告三线性表的链式存储.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告三线性表的链式存储.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构实验报告三线性表的链式存储
实验报告三线性表的链式存储
班级:
2010XXX姓名:
HoogLe学号:
2010XXXX专业:
XXXX
一、实验目的:
(1)掌握单链表的基本操作的实现方法。
(2)掌握循环单链表的基本操作实现。
(3)掌握两有序链表的归并操作算法。
二、实验内容:
(请采用模板类及模板函数实现)
1、线性表链式存储结构及基本操作算法实现
[实现提示](同时可参见教材p64-p73页的ADT描述及算法实现及ppt)函数、类名称等可自定义,部分变量请加上学号后3位。
也可自行对类中所定义的操作进行扩展。
所加载的库函数或常量定义:
#include
usingnamespacestd;
(1)单链表存储结构类的定义:
template
classLinkList{
public:
LinkList();//初始化带头结点空单链表构造函数实现
LinkList(Ta[],intn);//利用数组初始化带头结点的单链表构造函数实现
~LinkList();
intlength();//求单链表表长算法
Tget(inti);//获得单链表中第i个结点的值算法
intlocate(Ttemp);
voidinsert(inti,Ttemp);//在带头结点单链表的第i个位置前插入元素e算法
TDelete(inti);//在带头结点单链表中删除第i个元素算法
voidprint();//遍历单链表元素算法
boolisEmpty();//判单链表表空算法
voiddeleleAll();//删除链表中所有结点算法(这里不是析构函数,但功能相同)
private:
Node
};
(2)初始化带头结点空单链表构造函数实现
输入:
无
前置条件:
无
动作:
初始化一个带头结点的空链表
输出:
无
后置条件:
头指针指向头结点。
//初始化带头结点空单链表构造函数实现
template
LinkList
:
LinkList(){
head=newNode
head->next=NULL;
}
(3)利用数组初始化带头结点的单链表构造函数实现
输入:
已存储数据的数组及数组中元素的个数
前置条件:
无
动作:
利用头插或尾插法创建带头结点的单链表
输出:
无
后置条件:
头指针指向头结点,且数组中的元素为链表中各结点的数据成员。
//利用数组初始化带头结点的单链表构造函数实现
template
LinkList
:
LinkList(Ta[],intn){
head=newNode
head->next=NULL;
for(inti=0;i { Node s->data=a[i]; s->next=head->next; head->next=s; } } (4)在带头结点单链表的第i个位置前插入元素e算法 输入: 插入位置i,待插入元素e 前置条件: i的值要合法 动作: 在带头结点的单链表中第i个位置之前插入元素e 输出: 无 后置条件: 单链表中增加了一个结点 //在带头结点单链表的第i个位置前插入元素e算法 template voidLinkList : insert(inti,Ttemp){ Node intcount=0; while(p&&count { p=p->next; count++; } if(p==NULL)cout<<"i不合法,越界! "; else{ Node s->data=temp; s->next=p->next; p->next=s; } } (5)在带头结点单链表中删除第i个元素算法 输入: 删除第i个结点,待存放删除结点值变量e 前置条件: 单链表不空,i的值要合法 动作: 在带头结点的单链表中删除第i个结点,并返回该结点的值(由e传出)。 输出: 无 后置条件: 单链表中减少了一个结点 //在带头结点单链表中删除第i个元素算法 template TLinkList : Delete(inti){ Node intcount=0; while(p&&count p=p->next; count++; } if(p==NULL)cout<<"i不合法,越界! "; else{ Node Tx=s->data; p->next=s->next; returnx; } } (6)遍历单链表元素算法 输入: 无 前置条件: 单链表不空 动作: 遍历输出单链表中的各元素。 输出: 无 后置条件: 无 //遍历单链表元素算法 template voidLinkList : print(){ Node while(p){ cout< p=p->next; } cout< } (7)求单链表表长算法。 输入: 无 前置条件: 无 动作: 求单链表中元素个数。 输出: 返回元素个数 后置条件: 无 //求单链表表长算法 template intLinkList : length(){ Node intcount=0; while(p){ p=p->next; count++; } return--count; } (8)判单链表表空算法 输入: 无 前置条件: 无 动作: 判表是否为空。 输出: 为空时返回1,不为空时返回0 后置条件: 无 //判断非空 template boolLinkList : isEmpty(){ Node if(p)returntrue; elsereturnfalse; } (9)获得单链表中第i个结点的值算法 输入: 无 前置条件: i不空,i合法 动作: 找到第i个结点。 输出: 返回第i个结点的元素值。 后置条件: 无 //获得单链表中第i个结点的值算法 template TLinkList : get(inti){ Node intcount=0; while(p&&count p=p->next; count++; } if(p==NULL)cout<<"i不合法,越界! "; else{ returnp->data; } } (10)删除链表中所有结点算法(这里不是析构函数,但功能相同) 输入: 无 前置条件: 单链表存在 动作: 清除单链表中所有的结点。 输出: 无 后置条件: 头指针指向空 //删除所有元素 template voidLinkList : deleleAll(){ Node while(p) { Node p=p->next; t->next=NULL; } } (11)上机实现以上基本操作,写出main()程序: 参考p72 voidmain(){ inta[10]={1,2,3,4,5,6,7,8,9,0}; //测试带参数的构造函数(前端插入! ) LinkList //测试插入 if(list1.isEmpty()){ cout<<"链表不为空! "< } else{ cout<<"链表为空! "< } list1.print(); cout<<"测试插入"< list1.insert(5,20); list1.print(); cout<<"测试表长"< cout< cout<<"测试删除"< cout< list1.print(); cout<<"测试得到第5个元素"< cout< cout<<"测试删除所有元素! "< list1.deleleAll(); list1.print(); } 粘贴测试数据及运行结果: 2、参考单链表操作定义与实现,自行完成单循环链表的类的定义与相操作操作算法。 template classLinkList{ public: LinkList(Ta[],intn);//利用数组初始化带头结点的单循环链表构造函数实现 voidinsert(inti,Ttemp);//在带头结点单循环链表的第i个位置前插入元素e算法 TDelete(inti);//在带头结点单循环链表中删除第i个元素算法 voidprint();//遍历单循环链表元素算法 private: Node intlength; }; (1)利用数组初始化带头结点的单循环链表构造函数实现 输入: 已存储数据的数组及数组中元素的个数 前置条件: 无 动作: 利用头插或尾插法创建带头结点的单循环链表 输出: 无 后置条件: 头指针指向头结点,且数组中的元素为链表中各结点的数据成员,尾指针指向头结点。 //利用数组初始化带头结点的单循环链表构造函数实现 template LinkList : LinkList(Ta[],intn){ head=newNode head->next=head; length=0; for(inti=0;i { Node s->data=a[i]; s->next=head->next; head->next=s; length++; } } (2)在带头结点单循环链表的第i个位置前插入元素e算法 输入: 插入位置i,待插入元素e 前置条件: i的值要合法 动作: 在带头结点的单循环链表中第i个位置之前插入元素e 输出: 无 后置条件: 单循环链表中增加了一个结点 //在带头结点单循环链表的第i个位置前插入元素e算法 template voidLinkList : insert(inti,Ttemp){ cout< Node intcount=0; if(i>length)cout<<"i不合法,越界! "; else{ while(count p=p->next; count++; } Node s->data=temp; s->next=p->next; p->next=s; } } (3)在带头结点单循环链表中删除第i个元素算法 输入: 删除第i个结点,待存放删除结点值变量e 前置条件: 单循环链表不空,i的值要合法 动作: 在带头结点的单循环链表中删除第i个结点,并返回该结点的值(由e传出)。 输出: 无 后置条件: 单循环链表中减少了一个结点 //在带头结点单循环链表中删除第i个元素算法 template TLinkList : Delete(inti){ Node intcount=0; if(i>length)cout<<"i不合法,越界! "< else{ while(count p=p->next; count++; } Node Tx=s->data; p->next=s->next; returnx; } } (4)遍历单循环链表元素算法 输入: 无 前置条件: 单循环链表不空 动作: 遍历输出单循环链表中的各元素。 输出: 无 后置条件: 无 //遍历单循环链表元素算法 template voidLinkList : print(){ Node while(p! =head){ cout< p=p->next; } cout< } (5)上机实现以上基本操作,写出main()程序: voidmain(){ inta[10]={1,2,3,4,5,6,7,8,9,0}; //测试带参数的构造函数(前端插入! ) LinkList list1.print(); cout<<"测试插入"< list1.insert(5,20); list1.print(); cout<<"测试删除操作"< list1.Delete(5); list1.print(); } 粘贴测试数据及运行结果: 3、采用链式存储方式,并利用单链表类及类中所定义的算法加以实现线性表La,Lb为非递减的有序线性表,将其归并为新线性表Lc,该线性表仍有序(未考虑相同时删除一重复值)的算法。 模板函数: template voidLinkList : addtwo(LinkList Node Node intnum=0; while(p1&&p2){ if(p1->data>p2->data) { this->insert(++num,p1->data); p1=p1->next; } else{ this->insert(++num,p2->data); p2=p2->next; } } if(! p1) { p1=p2; } while(p1){ this->insert(++num,p1->data); p1=p1->next; } } voidmain(){ inta[5]={1,2,5,6,9}; intb[5]={0,3,4,7,8}; LinkList LinkList list1.print(); list2.print(); LinkList list3.addtwo(list1,list2); list3.print(); system("pause"); } 粘贴测试数据及运行结果: 选做题: 1、按一元多项式ADT的定义,实现相关操作算法: ADTPNodeis Data 系数(coef) 指数(exp) 指针域(next): 指向下一个结点 Operation 暂无 endADTPNode ADTPolynomialis Data PNode类型的头指针。 Operation Polynomail 初始化值: 无 动作: 申请头结点,由头指针指向该头结点,并输入m项的系数和指数,建立一元多项式。 DestroyPolyn 输入: 无 前置条件: 多项式已存在 动作: 消毁多项式。 输出: 无 后置条件: 头指针指向空 PolyDisplay 输入: 无 前置条件: 多项式已存在,不为空 动作: 输出多项式各项系数与指数 输出: 无 后置条件: 无 AddPoly 输入: 另一个待加的多项式 前置条件: 一元多项式pa和pb已存在。 动作及后置条件: 完成多项式相加运算,(采用pa=pa+pb形式,并销毁一元多项式pb) 输出: 无 endADTPolynomial 2、实现一元多项式的减法,操作描述如下: SubPoly 输入: 待减的多项式pb 前置条件: 一元多项式pa和pb已存在。 动作及后置条件: 完成多项式减法运算,即: pa=pa-pb,并销毁一元多项式pb。 输出: 无 3、参考P74-P79页双向链表的存储结构定义及算法,编程实现双向链表的插入算法和删除算法。 三、心得体会: (含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心得)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 线性 链式 存储