线性表的链式表示与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江大学城市学院实验报告
课程名称数据结构基础
实验项目名称实验五线性表的链式表示和实现
学生姓名吴奇专业班级信管1204 学号31201403
实验成绩指导老师(签名)日期
一.实验目的和要求
1、掌握线性表的链式存储结构;
2、掌握单链表、循环单链表的一些基本操作实现函数。
二.实验内容
1、设线性表采用带表头附加结点的单链表存储结构,请编写线性表各基本操作的实现函数,把它们存放在头文件LinkList.h中,同时建立一个验证操作实现的主函数文件test2_2.cpp。编译并调试程序,直到正确运行。
2、选做:编写一个函数void MergeList(LNode *&La, LNode *&Lb, LNode *&Lc) ,实现将两个带表头附加结点的有序单链表La和Lb合并成一个新的带表头附加结点的有序单链表Lc的功能,要求利用原存储空间。请把该函数添加到头文件LinkList.h中,并在主文件test2_2.cpp中添加相应语句进行测试。
3、填写实验报告,实验报告文件取名为report5.doc。
4、上传实验报告文件report5.doc、源程序文件test2_2.cpp及LinkList.h 到Ftp服务器上自己的文件夹下。
三. 函数的功能说明及算法思路
void initlist(lnode *&hl) 初始化链表
{
hl=new lnode; 新建头节点
if(!hl){
cout<<"储存分配失败,按任意键退出系统!!"< getchar(); exit(0); } hl->next=NULL; } bool insertlist(lnode *&hl,elemtype item) 链表中插入元素 { lnode *n,*ap,*cp; n=new lnode; ap ,cp为一前一后遍历指针 n->date=item; cp=hl; ap=NULL; while(cp!=NULL) 查找插入位置 { ap=cp; cp=cp->next; } n->next=cp; 插入元素 ap->next=n; return true; } bool emptylist(lnode *hl) 判断是否为空链表 { if(hl->next==NULL) return true; else return false; /*return hl->next==NULL;*/ } void travellist(lnode *hl) 遍历链表 { lnode *p; 新建指针P指向第一个节点p=hl->next; while(p!=NULL){ cout< p=p->next; } cout< } void getlist(lnode *hl,int pos) 得到链表中指定位置元素{ int i=0; lnode *p; 新建指针P指向第一个节点 p=hl->next; while(p!=NULL){ i++; if(i==pos) 查找需要得到的元素的位置 break; 找到,跳出 p=p->next; 往下遍历 } if(p!=NULL) cout< else{ cout<<"超出线性表的长度,按任意键退出!"< getchar(); exit(0); } } int lengthlist(lnode *hl) 计算链表长度 { int i=0; while(hl->next!=NULL){ i++; hl=hl->next; } return i; } void cleanlist(lnode *&hl) 清除链表 { lnode *ap,*cp; ap=hl->next; ap指针指向第一个节点 while(ap!=NULL) { cp=ap->next; cp指向下一个节点,防止断掉 delete ap; 删除当前节点 ap=cp; } hl->next=NULL; } bool deletelist(lnode *&hl,elemtype item) 删除链表中的指定元素{ if(hl->next==NULL){ cout<<"线性表为空,按任意键退出!"< getchar(); exit(0); } lnode *ap,*cp; ap,cp为遍历指针 ap=hl->next; cp=NULL; while(ap!=NULL){ if(ap->date==item) break; else{ cp=ap; ap=ap->next; } if(ap==NULL){ cout<<"没有需要删除的元素!"< return false; } } if(cp==NULL) hl->next=ap->next; else cp->next=ap->next; delete ap; cout<<"线性表中现在的元素为:"< travellist(hl); cout<<"线性表现在的长度为:"< return true; } void mergelist(lnode *&la,lnode *&lb,lnode *&lc) { lnode *p1,*p2,*p3; p1=la->next; p1指向la的第一个元素 p2=lb->next; p2指向lb的第一个元素 p3=lc; p3指向lc while(p1!=NULL&&p2!=NULL) { if(p1->date<=p2->date){ p3->next=p1; p1=p1->next; p3= p3->next; } else{ p3->next=p2; p2=p2->next; p3= p3->next; } } if(p1!=NULL) p3->next=p1; else p3->next=p2; } 四. 实验结果与分析