1、实验 一 线性表的基本操作实现及其应用实验 一 线性表的基本操作实现及其应用一、实验目的1、熟练掌握线性表的基本操作在两种存储结构上的实现。2、会用线性链表解决简单的实际问题。二、实验内容题目一 链表基本操作该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。其中,程序中的单链表(带头结点)结点为结构类型,结点值为整型。单链表操作的选择以菜单形式出现,如下所示:please input the operation: 1.初始化 2.清空 3.求链表长度 4.检查链表是否为空 5.检查链表是否为满 6.遍历链表(设为输出元素)7.从链表中查找元
2、素 8.从链表中查找与给定元素值相同的元素在表中的位置 9.向链表中插入元素 10. 从链表中删除元素 其他键退出。 实验 一 线性表的基本操作实现及其应用一、实验目的1、熟练掌握线性表的基本操作在两种存储结构上的实现。2、会用线性链表解决简单的实际问题。二、实验内容题目一 链表基本操作该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。其中,程序中的单链表(带头结点)结点为结构类型,结点值为整型。单链表操作的选择以菜单形式出现,如下所示:please input the operation: 1.初始化 2.清空 3.求链表长度 4.检查链
3、表是否为空 5.检查链表是否为满 6.遍历链表(设为输出元素)7.从链表中查找元素 8.从链表中查找与给定元素值相同的元素在表中的位置 9.向链表中插入元素 10. 从链表中删除元素 其他键退出。 题目一 链表基本操作一、数据结构与核心算法的设计描述1、单链表的最大长度#define MAXSIZE 1002、单链表的结点类型定义/* 定义elemtype为int类型 */typedef int elemtype; /* 单链表的结点类型 */typedef struct STD elemtype elem; STD *next;list, * linklist;3、初始化单链表 /* 函数功
4、能:对链表进行初始化 参数:链表(linklist L)成功初始化返回1,否则返回0 */ int init(linklist &L) L=(linklist)malloc(sizeof(list);/头结点申请内存。 if(!L) /判断有无申请到空间。 return 0; /没有申请到内存,参数失败返回0 L-next=NULL; L-elem=0; /单链表中有多少元素 return 1; /成功参数返回14、清空单链表 /* 函数功能:把链表清空 参数:链表(linklist L)成功清空链表返回1 */int makeempty(linklist &L) linklist p,q;
5、p=L-next; while(p) /当p非空时,删除p q=p; p=p-next; free(q); L-next=NULL; /只剩头指针,所以L-next=NULL L-elem=0; /清空后链表中元素为0 return 1; /清空后返回15、求链表长度 /* 函数功能:返回链表的长度参数;链表(linklist L)函数返回链表的长度 */int getlength(linklist L) linklist p; p=L-next; int j=0; while(p) j+; /统计链表中元素 p=p-next; return j; /最后返回链表长度.6、判断链表是否为空/*
6、 函数功能:判断链表是否为空参数;链表(linklist L)链表为空时返回0,不为空返回1 */int isempty(linklist L) if(L-next) /头结点后有元素表示链表不空则返回1 return 1; else return 0; /头结点后没有元素表示链表不空则返回07、检查链表是否为满/* 函数功能:判断链表是否为满参数;链表(linklist L)链表为满时返回0,不为满返回1 */int isfull(linklist L) if(L-elem next; if(isempty(L)=0) /当链表为空时则输出链表为空 cout链表为空!; while(p) /
7、当链表为不空时则输出链表每个节点的elem值 coutelemnext; coutnext; while(p) if(p-elem=i) /判断有无元素I,有返回1 return 1; p=p-next; return 0; /没有找到返回010、从链表中查找与给定元素值相同的元素在表中的位置/* 函数功能: 从链表中查找给定元素的位置参数;链表(linklist L),给定元素(int i)如果链表中有给定元素i则返回元素的位置, 没有则返回0 */int location(linklist L,int i) linklist p; int j=0; p=L-next; while(p) j
8、+; if(p-elem=i) /判断有无元素i,有返回其的位置j return j; p=p-next; return 0; /没有则返回011、向链表中插入元素/* 函数功能:向链表中的某个位置插入元素参数;链表(linklist L),位置(int i),元素(elemtype e)成功插入返回1,否则返回0 */int insert(linklist &L, int i, elemtype e) linklist p, s; int j = 0; p = L; while (p&jnext; j +; if(ji-1|!p) /不符合条件返回0 return 0; s = (linkl
9、ist)malloc(sizeof(list); /给节点s分配内存 s-elem = e; s-next = p-next; /插入操作 p-next = s; L-elem+; /插入完成后头结点的elem加1 return 1; /成功插入返回112、从链表中删除元素/* 函数功能:在链表中的某个位置删除元素参数;链表(linklist L),位置(int i),元素(elemtype e)成功删除返回1,否则返回0 */int deleteelem(linklist &L,int i) linklist p,q; int j=0; p=L; while (p-next&jnext; j
10、+; if(ji-1|!(p-next) /不符合条件返回0 return 0; q=p-next; p-next=q-next; /删除操作 free(q); L-elem-; /插入完成后头结点的elem减1 return 1; /成功删除返回113、主界面函数/* 函数功能:显示所有操作功能参数;无 */void zhujiemian() coutendlendl; couttttt数据结构实验一endl; couttt-endlendl; couttt 1 链表初始化endl; couttt 2 清空链表endl; couttt 3 求链表长度endl; couttt 4 链表是否为空
11、endl; couttt 5 检查链表是否为满endl; couttt 6 遍历链表endl; couttt 7 从链表中查找元素endl; couttt 8 从链表中查找与给定元素值相同的元素在表中的位置endl; couttt 9 向链表中插入元素endl; couttt10 从链表中删除元素endlendl; couttt其他键退出endl; couttt-endlendlendl; couta; /输入要进行的操作的序号 coutendl; do switch(a) /用switch语句进行选择操作 case 1: /初始化 if(init(L)=1) cout初始化成功!endl;
12、else cout初始化失败!endl; break; case 2: if(makeempty(L)=1) /链表置空 cout链表已清空!endl; else cout链表清空失败!endl; break; case 3: /链表的长度 b=getlength(L); cout链表的长度为:bendl; break; case 4: /判断链表是否空 if(isempty(L)=1) cout链表不空!endl; else cout链表为空!endl; break; case 5: /判断链表是否满 if(isfull(L)=1) cout链表不满!endl; else cout链表已满!
13、endl; break; case 6: /遍历链表 show(L); break; case 7: /链表是否有要查找元素 coutb; if(find(L,b)=1) cout链表中有元素bendl; else cout链表没中有元素bendl; break; case 8: /输出链表要查找元素的位置 cout您要查找的元素为:b; if(location(L,b)=0) cout没有您要查找的元素bendl; else cout您查找的元素b在第location(L,b)个位置。endl; break; case 9: do cout输入你要插入的位置和元素bc; while (bge
14、tlength(L)+1)/* 此处可以对错误的输入进行判断 */ cout插入位置错误!请重新插入!bc; if(insert(L,b,c)=0) cout您插入的位置不对,插入失败!endl; else cout插入成功!endl; coutYES; while(YES=Y|YES=y); break; case 10: do if(getlength(L)=0)/判断链表是否为空若是则输出链表为空,并继续 cout链表为空无法删除!endl; break; cout输入你要删除元素的位置:b; while(bgetlength(L)/* 此处可以对错误的输入进行判断 */ cout输入错
15、误!请重新输入!b; if(deleteelem(L,b)=0) cout您删除的位置不对,删除失败!endl; else cout删除成功!endl; coutYES; while(YES=Y|YES=y); break; default: break; system(pause);/按任意键继续 system(cls);/清理屏幕上的内容 zhujiemian();/显示主界面 cina; /输入要进行操作的序号 cout0&a=10);/对进行输入的数进行判断(不在09则程序结束)说明:通过调用序列号不同的函数进行各种操作。函数根据每次输入的数进行判断不在110内的函数将结束,否则将继续
16、进行。三、程序调试及运行结果分析 程序第一步必须执行初始化,否则程序不能运行。 在程序第一步必须执行初始化后,程序完美运行,在进行任何函数操作程序都是正常运行,而且本程序对插入和删除时进行错误检测如有的地方不可以插入,有点地方不能删除,如果链表为空时则程序会输出链表为空,并继续进行其他操作,大大减少了程序的bug。四、实验总结 通过这次试验我熟悉了对链表的基本操作,对基本的链表操作有了很好的掌握,知道自己容易在什么地方出错。五、程序清单/实验一.h#include iostream#include malloc.h#include stdlib.h#include windows.husing
17、 namespace std;#define MAXSIZE 100 /链表的最大长度typedef int elemtype;typedef struct STD elemtype elem; STD *next;list, * linklist;void zhujiemian() coutendlendl; couttttt数据结构实验一endl; couttt-endlendl; couttt 1 链表初始化endl; couttt 2 清空链表endl; couttt 3 求链表长度endl; couttt 4 链表是否为空endl; couttt 5 检查链表是否为满endl; co
18、uttt 6 遍历链表endl; couttt 7 从链表中查找元素endl; couttt 8 从链表中查找与给定元素值相同的元素在表中的位置endl; couttt 9 向链表中插入元素endl; couttt10 从链表中删除元素endlendl; couttt其他键退出endl; couttt-endlendlendl; coutnext=NULL; L-elem=0; return 1;int insert(linklist &L, int i, elemtype e) linklist p, s; int j = 0; p = L; while (p&jnext; j +; if(
19、ji-1|!p) return 0; s = (linklist)malloc(sizeof(list); s-elem = e; s-next = p-next; p-next = s; L-elem+; return 1;int deleteelem(linklist &L,int i) linklist p,q; int j=0; p=L; while (p-next&jnext; j+; if(ji-1|!(p-next) return 0; q=p-next; p-next=q-next; free(q); L-elem-; return 1;int isempty(linklist
20、 L) if(L-next) return 1; else return 0;void show(linklist L) linklist p; p=L-next; if(isempty(L)=0) cout链表为空!; while(p) coutelemnext; coutnext; int j=0; while(p) j+; p=p-next; return j;int makeempty(linklist &L) linklist p,q; p=L-next; while(p) q=p; p=p-next; free(q); L-next=NULL; L-elem=0; return 1
21、;int find(linklist L, int i) linklist p; p=L-next; while(p) if(p-elem=i) return 1; p=p-next; return 0;int location(linklist L,int i) linklist p; int j=0; p=L-next; while(p) j+; if(p-elem=i) return j; p=p-next; return 0;int isfull(linklist L) if(L-elem a; coutendl; do switch(a) case 1: if(init(L)=1) cout初始化成功!endl; else cout初始化失败!endl; break; case 2: if(makeempty(L)=1) cout链表已清空!endl;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1