1、数据结构实验报告三线性表的链式存储实验报告三 线性表的链式存储班级: 2010XXX 姓名: HoogLe 学号: 2010XXXX 专业: XXXX 2858505197一、 实验目的:(1) 掌握单链表的基本操作的实现方法。(2) 掌握循环单链表的基本操作实现。(3) 掌握两有序链表的归并操作算法。二、 实验内容:(请采用模板类及模板函数实现)1、线性表链式存储结构及基本操作算法实现实现提示 (同时可参见教材p64-p73页的ADT描述及算法实现及ppt)函数、类名称等可自定义,部分变量请加上学号后3位。也可自行对类中所定义的操作进行扩展。所加载的库函数或常量定义:#include usi
2、ng namespace std;(1)单链表存储结构类的定义:templateclass LinkListpublic: LinkList(); /初始化带头结点空单链表构造函数实现 LinkList(T a,int n);/利用数组初始化带头结点的单链表构造函数实现 LinkList(); int length(); /求单链表表长算法 T get(int i); /获得单链表中第i个结点的值算法 int locate(T temp); void insert(int i,T temp); /在带头结点单链表的第i个位置前插入元素e算法 T Delete(int i); /在带头结点单链表
3、中删除第i个元素算法 void print(); /遍历单链表元素算法 bool isEmpty(); /判单链表表空算法 void deleleAll(); /删除链表中所有结点算法(这里不是析构函数,但功能相同)private: Node *head;(2)初始化带头结点空单链表构造函数实现输入:无前置条件:无动作:初始化一个带头结点的空链表输出:无后置条件:头指针指向头结点。/初始化带头结点空单链表构造函数实现templateLinkList:LinkList() head = new Node; head-next = NULL;()利用数组初始化带头结点的单链表构造函数实现输入:已存
4、储数据的数组及数组中元素的个数前置条件:无动作:利用头插或尾插法创建带头结点的单链表输出:无后置条件:头指针指向头结点,且数组中的元素为链表中各结点的数据成员。/利用数组初始化带头结点的单链表构造函数实现templateLinkList:LinkList(T a,int n) head=new Node; head-next=NULL; for (int i=0; in; i+) Node *s=new Node; s-data=ai; s-next=head-next; head-next=s; ()在带头结点单链表的第i个位置前插入元素e算法输入:插入位置i,待插入元素e前置条件:i的值要
5、合法动作:在带头结点的单链表中第i个位置之前插入元素e输出:无后置条件:单链表中增加了一个结点 /在带头结点单链表的第i个位置前插入元素e算法templatevoid LinkList:insert(int i,T temp) Node *p = head; int count = 0; while (p&countnext; count+; if (p=NULL) couti不合法,越界!; else Node *s = new Node; s-data = temp; s-next = p-next; p-next = s; ()在带头结点单链表中删除第i个元素算法输入:删除第i个结点,待
6、存放删除结点值变量e前置条件:单链表不空,i的值要合法动作:在带头结点的单链表中删除第i个结点,并返回该结点的值(由e传出)。输出:无后置条件:单链表中减少了一个结点 /在带头结点单链表中删除第i个元素算法templateT LinkList:Delete(int i) Node *p = head; int count = 0; while(p&countnext; count+; if (p=NULL) couti不合法,越界!; else Node *s = p-next; T x= s-data; p-next = s-next; return x; ()遍历单链表元素算法输入:无前置
7、条件:单链表不空动作:遍历输出单链表中的各元素。输出:无后置条件:无/遍历单链表元素算法templatevoid LinkList:print() Node *p = head-next; while(p) coutdatanext; coutendl;()求单链表表长算法。输入:无前置条件:无动作:求单链表中元素个数。输出:返回元素个数后置条件:无/求单链表表长算法templateint LinkList:length() Node *p = head; int count = 0; while(p) p=p-next; count+; return -count;()判单链表表空算法输入:
8、无前置条件:无动作:判表是否为空。输出:为空时返回,不为空时返回0后置条件:无/判断非空templatebool LinkList:isEmpty() Node *p = head-next; if (p) return true; else return false;()获得单链表中第i个结点的值算法输入:无前置条件:i不空,i合法动作:找到第i个结点。输出:返回第i个结点的元素值。后置条件:无/获得单链表中第i个结点的值算法templateT LinkList:get(int i) Node *p = head; int count = 0; while(p&countnext; coun
9、t+; if (p=NULL) coutdata; (10)删除链表中所有结点算法(这里不是析构函数,但功能相同)输入:无前置条件:单链表存在动作:清除单链表中所有的结点。输出:无后置条件:头指针指向空/删除所有元素templatevoid LinkList:deleleAll() Node *p = head; while (p) Node *t=p; p=p-next; t-next=NULL; (11)上机实现以上基本操作,写出main()程序:参考p72void main() int a10=1,2,3,4,5,6,7,8,9,0; /测试带参数的构造函数(前端插入!) LinkLis
10、t list1(a,10); /测试插入 if (list1.isEmpty() cout链表不为空!endl; else cout链表为空!endl; list1.print(); cout测试插入endl; list1.insert(5,20); list1.print(); cout测试表长endl; coutlist1.length()endl; cout测试删除endl; coutlist1.Delete(5)endl; list1.print(); cout测试得到第5个元素endl; coutlist1.get(5)endl; cout测试删除所有元素!endl; list1.d
11、eleleAll(); list1.print();粘贴测试数据及运行结果:2、参考单链表操作定义与实现,自行完成单循环链表的类的定义与相操作操作算法。templateclass LinkListpublic: LinkList(T a,int n);/利用数组初始化带头结点的单循环链表构造函数实现 void insert(int i,T temp); /在带头结点单循环链表的第i个位置前插入元素e算法 T Delete(int i); /在带头结点单循环链表中删除第i个元素算法 void print(); /遍历单循环链表元素算法private: Node *head; int length
12、;()利用数组初始化带头结点的单循环链表构造函数实现输入:已存储数据的数组及数组中元素的个数前置条件:无动作:利用头插或尾插法创建带头结点的单循环链表输出:无后置条件:头指针指向头结点,且数组中的元素为链表中各结点的数据成员,尾指针指向头结点。/利用数组初始化带头结点的单循环链表构造函数实现templateLinkList:LinkList(T a,int n) head=new Node; head-next= head ; length = 0; for (int i=0; in; i+) Node *s=new Node; s-data=ai; s-next = head-next; h
13、ead-next=s; length+; ()在带头结点单循环链表的第i个位置前插入元素e算法输入:插入位置i,待插入元素e前置条件:i的值要合法动作:在带头结点的单循环链表中第i个位置之前插入元素e输出:无后置条件:单循环链表中增加了一个结点 /在带头结点单循环链表的第i个位置前插入元素e算法templatevoid LinkList:insert(int i,T temp) coutlengthendl; Node *p = head; int count = 0; if (ilength) couti不合法,越界!; else while (countnext; count+; Node
14、 *s = new Node; s-data = temp; s-next = p-next; p-next = s; ()在带头结点单循环链表中删除第i个元素算法输入:删除第i个结点,待存放删除结点值变量e前置条件:单循环链表不空,i的值要合法动作:在带头结点的单循环链表中删除第i个结点,并返回该结点的值(由e传出)。输出:无后置条件:单循环链表中减少了一个结点 /在带头结点单循环链表中删除第i个元素算法templateT LinkList:Delete(int i) Node *p = head; int count = 0; if (ilength) couti不合法,越界!endl;
15、else while(countnext; count+; Node *s = p-next; T x= s-data; p-next = s-next; return x; ()遍历单循环链表元素算法输入:无前置条件:单循环链表不空动作:遍历输出单循环链表中的各元素。输出:无后置条件:无/遍历单循环链表元素算法templatevoid LinkList:print() Node *p = head-next; while(p!=head) coutdatanext; coutendl;()上机实现以上基本操作,写出main()程序:void main() int a10=1,2,3,4,5,
16、6,7,8,9,0; /测试带参数的构造函数(前端插入!) LinkList list1(a,10); list1.print(); cout测试插入endl; list1.insert(5,20); list1.print(); cout测试删除操作endl; list1.Delete(5); list1.print();粘贴测试数据及运行结果:、采用链式存储方式,并利用单链表类及类中所定义的算法加以实现线性表La,Lb为非递减的有序线性表,将其归并为新线性表Lc,该线性表仍有序(未考虑相同时删除一重复值)的算法。模板函数:templatevoid LinkList:addtwo(LinkL
17、ist La,LinkList Lb) Node *p1=La.head-next; Node *p2=Lb.head-next; int num=0; while(p1&p2) if (p1-datap2-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; void main() int a5=1,2,5,6,9; int b5=0,3,4
18、,7,8; LinkList list1(a,5); LinkList list2(b,5); list1.print(); list2.print(); LinkList list3; list3.addtwo(list1,list2); list3.print(); system(pause);粘贴测试数据及运行结果:选做题:、按一元多项式ADT的定义,实现相关操作算法:ADT PNode isData 系数(coef)指数(exp)指针域(next):指向下一个结点Operation暂无end ADT PNodeADT Polynomial isData PNode类型的头指针。Oper
19、ation Polynomail 初始化值:无 动作:申请头结点,由头指针指向该头结点,并输入m项的系数和指数,建立一元多项式。 DestroyPolyn 输入:无前置条件: 多项式已存在动作:消毁多项式。输出:无后置条件:头指针指向空 PolyDisplay 输入:无前置条件: 多项式已存在,不为空动作:输出多项式各项系数与指数输出:无后置条件:无AddPoly输入:另一个待加的多项式前置条件:一元多项式pa和pb已存在。动作及后置条件:完成多项式相加运算,(采用pa=pa+pb形式,并销毁一元多项式pb)输出:无end ADT Polynomial、实现一元多项式的减法,操作描述如下:SubPoly输入:待减的多项式pb前置条件:一元多项式pa和pb已存在。动作及后置条件:完成多项式减法运算,即:pa=pa-pb,并销毁一元多项式pb。输出:无、参考P74-P79页双向链表的存储结构定义及算法,编程实现双向链表的插入算法和删除算法。三、 心得体会:(含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心得)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1