线性表的链式表示与实现
- 格式:doc
- 大小:93.00 KB
- 文档页数:10
数学与计算科学学院实验报告实验项目名称线性表的链式表示与实现所属课程名称数据结构实验类型验证型实验日期班级学号姓名成绩2.调试第一次显示错误如下:原因:由于没有头文件及宏定义以及自定义,因此导致许多错误,可能还有许多错误没有显示3. 将以下语句编入VC++6.0中#include "stdio.h"#include "stdlib.h"#define OK 1#define ERROR 0typedef int ElemType;typedef int Status;4.调试第二次显示错误如下:原因:由于算法中许多变量没有定义,因此有许多错误5. 将以下语句加入算法中:int i;LinkList p;(加入创建链表的算法中)LinkList p;int j;(加入查找元素的算法中)LinkList p,s;int j;(加入插入元素的算法中)LinkList p,q;int j;(加入删除元素的算法中)6.调试第三次显示没有错误:7. 现在开始编写主函数:(1)先编写调用创建链表的函数的主函数:如下:void main(){LinkList L;int i,n;scanf("%d",&n);CreateList_L(L,n);for(i=n;i>0;--i)printf("%d ",L->data);printf("\n");}调试显示为:运行显示为:产生了随机数说明for循环语句那里编写错误因此修改为:LinkList p;for(p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);调试显示为:运行显示为:这次正确了那么继续编写下面的其他主函数,形成的总的主函数为:void main(){LinkList L,p;int i,n;scanf("%d",&n);CreateList_L(L,n);for(p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);printf("\n");ElemType e;scanf("%d", &i);GetElem_L(L, i, e);printf("%d\n",e);scanf("%d",&i);scanf("%d",&e);ListInsert_L(L, i, e);for(p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);printf("\n");scanf("%d", &i);ListDelete_L(L,i,e);printf("%d\n",e);for(p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);printf("\n");}8.调试第四次显示为:9.运行显示结果为:10. 但运行后的界面显得很单调;要是忘记下一个算法是什么就容易输入出错,也不适合大众使用;因此为了将程序优化,所以在主函数中增加以下输入输出语句和条件语句;为了让程序更加严谨,因此还加入一些循环语句以及条件语句,那么主函数语句变为:main(){LinkList L,p;int i,n,x,y,z;ElemType e;printf("请输入您想构建的链式表的元素个数:\n");scanf("%d",&n);printf("请输入您想构建的链式表:\n");CreateList_L(L,n);printf("您构建的链式表是:\n");for(p=L->next;p!=NULL;p=p->next)printf("%d ",p->data);printf("\n");printf("请输入您想查找的元素是第几个元素:\n");scanf("%d", &i);for(x=2;(i<=0||i>n)&&x>=0;--x){switch(x){case 2:printf("输入的数字错误,还有两次重新输入符合要求的数字的机会:\n");break;case 1:printf("输入的数字错误,还有一次重新输入符合要求的数字的机会:\n");break;case 0:printf("输入的数字错误,您的输入机会已经用完\n");return ERROR;printf("%d ",p->data);printf("\n");return 0;}11.调试第五次显示为:、12.运行后结果显示为:这样那么程序就完整了,清晰明了,用户运行的时候也易知道自己要输入什么了【实验结论】(结果)。
数据结构课程标准课程目标1:理解线性表、栈和队列、串、树和二叉树和图的逻辑结构,掌握在各种逻辑结构上的各种基本操作的实现,培养学生进行复杂程序设计的能力和数据抽象的能力。
课程目标2:熟练掌握常用的静态查找和动态查找算法,深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用。
课程目标3:能够从时间和空间复杂性的角度综合比较各种算法的复杂度,并能分析顺序存储和链式存储两种常用存储结构的不同特点及适用场合。
三、课程目标与毕业要求的关系1、课程目标与毕业要求的对应关系课程目标2课程目标3注:H表示高支撑,M表示中支撑,1表示低支撑。
参考《数学学院课程目标达成度评价方法》进行评价。
九、本课程各个课程目标的权重依据第八部分中的课程目标达成度评价方法,计算得到本课程的各个课程目标的权重如下:根据学生的课堂表现、作业、平时测验和期末考试情况及教学督导的反馈,检验学生对本课程涉及的学科素养和学会反思的达成情况,及时对教学中的不足之处进行改进,调整教学指导策略;根据学生的课堂表现、作业、平时测验及期末考试成绩,检验本课程所支撑的毕业要求分解指标点的达成度情况;根据本课程所支撑的毕业要求分解指标点的达成度情况,在本学院教学指导委员会指导下,重新修订本课程大纲,实现持续改进。
十一、推荐教材及参考书目1.教材1.孙丽云.数据结构(C语言版)[M].武汉:华中科技大学出版社,2017.2.参考书目2.孙丽云.数据结构实验指导与习题解析(C语言版)[M].北京:华中科技大学出版社,2017.3.严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2012.4.高一凡,数据结构算法解析[M].北京:清华大学出版社,2015.。
浙江大学城市学院实验报告课程名称数据结构基础实验项目名称实验五线性表的链式表示和实现学生姓名专业班级学号实验成绩指导老师(签名)日期一.实验目的和要求1、了解线性表的链式存储结构,学会定义线性表的链式存储结构。
2、掌握单链表、循环单链表的一些基本操作实现函数。
二.实验内容1、设线性表采用带表头附加结点的单链表存储结构,请编写线性表抽象数据类型各基本操作的实现函数,并存放在头文件LinkList.h中(注:教材上为不带表头附加结点)。
同时建立一个验证操作实现的主函数文件test5.cpp,编译并调试程序,直到正确运行。
提示:⑴单向链表的存储结构可定义如下:struct LNode { // 定义单链表节点类型ElemType data; // 存放结点中的数据信息LNode *next; // 指示下一个结点地址的指针}⑵线性表基本操作可包括如下一些:①void InitList (LNode *&H) //初始化单链表②void ClearList(LNode *&H) //清除单链表③int LengthList (LNode *H) //求单链表长度④bool EmptyList (LNode *H) //判断单链表是否为空表⑤ElemType GetList (LNode *H, int pos)//取单链表第pos 位置上的元素⑥void TraverseList(LNode *H) //遍历单链表⑦bool InsertList ( LNode *&H, ElemType item, int pos)//向单链表插入一个元素⑧bool DeleteList ( LNode *&H, ElemType &item, int pos)//从单链表中删除一个元素⑶带表头附加结点的单链表初始化操作的实现可参考如下:void InitList(LNode *&H){ //构造一个空的线性链表H,即为链表设置一个头结点,//头结点的data数据域不赋任何值,头结点的指针域next则为空H=(LNode *)malloc(sizeof(LNode)); // 产生头结点Hif (!H) exit(0); // 存储分配失败,退出系统H->next=NULL; // 指针域为空}2、选做部分:编写一个函数void MergeList(LNode *&La, LNode *&Lb, LNode *&Lc),实现将两个有序单链表La和Lb合并成一个新的有序单链表Lc,同时销毁原有单链表La和Lb。
大连理工大学2024年硕士研究生入学考试大纲科目代码:810 科目名称:数据结构Ⅰ.考查目标计算机学科专业基础综合考试是为大连理工大学招收计算机科学与技术学科的硕士研究生而设置的具有选拔性质的联考科目,其目的是科学、公平、有效地测试考生掌握计算机科学与技术学科大学本科阶段专业基础知识、基本理论、基本方法的水平和分析问题、解决问题的能力,评价的标准是高等学校计算机科学与技术学科优秀本科生所能达到的及格或及格以上水平,以利于大连理工大学择优选拔,确保硕士研究生的入学质量。
Ⅱ.考查范围计算机学科专业基础综合考试以数据结构专业基础课程。
要求考生系统地掌握数据结构课程的概念、基本原理和基本方法,能够运用所学的基本原理和基本方法分析、判断和解决有关理论问题和实际问题。
Ⅲ.考查内容数据结构[考查目标]1.掌握数据结构的基本概念、基本原理和基本方法。
2.掌握数据的逻辑结构、存储结构及基本操作的实现,能够对算法进行基本的时间复杂度与空间复杂度的分析。
3.能够运用数据结构的基本原理和方法进行问题的分析与求解,具备采用C或C++语言设计与实现算法的能力。
一、线性表1.线性表的定义2.线性表的顺序表示和实现3.线性表的链式表示和实现4.线性表的应用二、栈、队列和数组1.栈和队列的基本概念2.栈的顺序表示和实现3.栈的链式表示和实现4.队列的顺序表示和实现5.队列的链式表示和实现6.栈和队列的应用7.数组的定义,数组的顺序表示和实现8.矩阵的压缩存储三、树与二叉树1.树的定义和基本概念2.二叉树(1) 二叉树的定义及性质(2) 二叉树的存储结构(3) 二叉树的遍历(4) 线索二叉树3.树、森林(1) 树的存储结构(2) 树和二叉树的转换,森林与二叉树的转换(3) 树和森林的遍历4.哈夫曼(Huffman)树和哈夫曼编码四、图1.图的定义和基本概念2.图的存储方式(1) 数组(邻接矩阵)表示法(2) 邻接表3.图的遍历及其应用(1) 深度优先搜索(2) 广度优先搜索4.图的基本应用(1) 最小生成树(2) 最短路径(3) 拓扑排序(4) 关键路径五、查找1.查找的基本概念2.静态查找表(1) 顺序查找法(2) 折半查找法3.动态查找表(1) 二叉排序树和平衡二叉树(2) B-树4.哈希(Hash)表5.查找算法的分析及应用六、排序1.排序的基本概念2.插入排序(1) 直接插入排序(2) 折半插入排序3.起泡排序(bubble sort)4.简单选择排序5.希尔排序(shell sort)6.快速排序7.堆排序8.二路归并排序(merge sort)9.基数排序10.外部排序11.各种排序算法的比较12.排序算法的应用复习参考资料:《数据结构(c语言版)》,严蔚敏,吴伟民编著,清华大学出版社.。
浙江大学城市学院实验报告课程名称数据结构基础实验项目名称实验五线性表的链式表示和实现学生姓名吴奇专业班级信管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<<"储存分配失败,按任意键退出系统!!"<<endl;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;elsereturn false;/*return hl->next==NULL;*/}void travellist(lnode *hl) 遍历链表{ lnode *p; 新建指针P指向第一个节点p=hl->next;while(p!=NULL){cout<<p->date<<" ";p=p->next;}cout<<endl;}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<<p->date<<endl;else{cout<<"超出线性表的长度,按任意键退出!"<<endl;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<<"线性表为空,按任意键退出!"<<endl;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<<"没有需要删除的元素!"<<endl;return false;}}if(cp==NULL)hl->next=ap->next;elsecp->next=ap->next;delete ap;cout<<"线性表中现在的元素为:"<<endl;travellist(hl);cout<<"线性表现在的长度为:"<<lengthlist(hl)<<endl;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指向lcwhile(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;elsep3->next=p2;}四. 实验结果与分析五. 心得体会本次实验中遇到的问题还是比较多的,脑子已经被链表搞的稀里糊涂的了,但是基本的操作已经弄懂了,只是这次实验的选作部分有点错误,经过老师的知道解决了这个问题.【附录----源程序】Test5.cpp#include<iostream.h>#include<stdio.h>#include<stdlib.h>typedef int elemtype;#include"linklist.h"void main(){elemtype x,y,z,j,k,l;lnode *mylist,*mylist1,*mylist2,*newlist;initlist(mylist);initlist(newlist);initlist(mylist1);initlist(mylist2);cout<<"请输入任意正整数插入第一个线性表中,以输入任意<=0的数为结束标志:"<<endl;cin>>x;while(x>0){insertlist(mylist,x);cin>>x;}if(emptylist(mylist)){cout<<"第一个线性表为空,按任意键退出!"<<endl;getchar();exit(0);}else{cout<<"第一个线性表中的元素为:"<<endl;travellist(mylist);}cout<<"第一个线性表的初始长度为:"<<lengthlist(mylist)<<endl;cout<<"请输入你想要查询第一个线形表的第几个元素:"<<endl;cin>>k;cout<<"第一个线性表中第"<<k<<"个元素为:";getlist(mylist,k);cout<<"请输入需要删除的一个元素:"<<endl;cin>>j;deletelist(mylist,j);cout<<"是否继续删除?1-是,2-否"<<endl;cin>>l;while(l==1){cout<<"请输入需要删除的一个元素:"<<endl;cin>>j;deletelist(mylist,j);cout<<"是否继续删除?1-是,2-否"<<endl;cin>>l;}cout<<"请输入任意有序正整数插入需要合并的第一个线性表中,以输入任意<=0的数为结束标志:"<<endl;cin>>y;while(y>0){insertlist(mylist1,y);cin>>y;}if(emptylist(mylist)){cout<<"第一个线性表为空,按任意键退出!"<<endl;getchar();exit(0);}else{cout<<"线性表中的元素为:"<<endl;travellist(mylist1);}cout<<"请输入任意有序正整数插入需要合并的第二个线性表中,以输入任意<=0的数为结束标志:"<<endl;cin>>z;while(z>0){insertlist(mylist2,z);cin>>z;}if(emptylist(mylist)){cout<<"第二个线性表为空,按任意键退出!"<<endl;getchar();exit(0);}else{cout<<"线性表中的元素为:"<<endl;travellist(mylist2);}mergelist(mylist1,mylist2,newlist);cout<<"新线性表中的元素为:"<<endl;travellist(newlist);}linklist.hstruct lnode{elemtype date;lnode *next;};void initlist(lnode *&hl){hl=new lnode;if(!hl){cout<<"储存分配失败,按任意键退出系统!!"<<endl;getchar();exit(0);}hl->next=NULL;}bool insertlist(lnode *&hl,elemtype item){lnode *n,*ap,*cp;n=new lnode;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;elsereturn false;/*return hl->next==NULL;*/}void travellist(lnode *hl){ lnode *p;p=hl->next;while(p!=NULL){cout<<p->date<<" ";p=p->next;}cout<<endl;}void getlist(lnode *hl,int pos){int i=0;lnode *p;p=hl->next;while(p!=NULL){i++;if(i==pos)break;p=p->next;}if(p!=NULL)cout<<p->date<<endl;else{cout<<"超出线性表的长度,按任意键退出!"<<endl;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;while(ap!=NULL){cp=ap->next;delete ap;ap=cp;}hl->next=NULL;}bool deletelist(lnode *&hl,elemtype item){ if(hl->next==NULL){cout<<"线性表为空,按任意键退出!"<<endl;getchar();exit(0);}lnode *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<<"没有需要删除的元素!"<<endl;return false;}}if(cp==NULL)hl->next=ap->next;elsecp->next=ap->next;delete ap;cout<<"线性表中现在的元素为:"<<endl;travellist(hl);cout<<"线性表现在的长度为:"<<lengthlist(hl)<<endl;return true;}void mergelist(lnode *&la,lnode *&lb,lnode *&lc){lnode *p1,*p2,*p3;p1=la->next;p2=lb->next;while(p1!=NULL&&p2!=NULL){if(p1->date<=p2->date){lc->next=p1;p1=p1->next;lc=lc->next;}else{lc->next=p2;p2=p2->next;lc=lc->next;}}if(p1!=NULL)lc->next=p1;elselc->next=p2;}。