实验报告 线性表的顺序存储结构
- 格式:doc
- 大小:69.00 KB
- 文档页数:4
顺序表的基本操作实验报告一、实验目的本次实验旨在深入理解和掌握顺序表的基本操作,包括顺序表的创建、插入、删除、查找和遍历等功能,并通过实际编程实现,加深对数据结构中顺序存储结构的理解和应用能力。
二、实验环境本次实验使用的编程语言为 C 语言,编程环境为 Visual Studio 2019。
三、实验原理顺序表是一种线性表的顺序存储结构,它使用一组连续的存储单元依次存储线性表中的元素。
在顺序表中,元素的逻辑顺序与物理顺序是一致的。
顺序表的基本操作包括:1、创建顺序表:为顺序表分配存储空间,并初始化相关参数。
2、插入操作:在指定位置插入元素,需要移动后续元素以腾出空间。
3、删除操作:删除指定位置的元素,并将后续元素向前移动。
4、查找操作:在顺序表中查找指定元素,返回其位置或表示未找到。
5、遍历操作:依次访问顺序表中的每个元素。
四、实验步骤1、定义顺序表的数据结构```cdefine MAXSIZE 100 //定义顺序表的最大长度typedef struct {int dataMAXSIZE; //存储顺序表元素的数组int length; //顺序表的当前长度} SeqList;```2、顺序表的创建```cvoid InitList(SeqList L) {L>length = 0; //初始化顺序表长度为 0}```3、顺序表的插入操作```cint InsertList(SeqList L, int i, int e) {if (L>length >= MAXSIZE) {//顺序表已满return 0;}if (i < 1 || i > L>length + 1) {//插入位置不合法return 0;}for (int j = L>length; j >= i; j) {//移动元素为插入腾出位置L>dataj = L>dataj 1;}L>datai 1 = e; //插入元素L>length++;//顺序表长度增加 1return 1;}```4、顺序表的删除操作```cint DeleteList(SeqList L, int i) {if (i < 1 || i > L>length) {//删除位置不合法return 0;}for (int j = i; j < L>length; j++){//移动元素填补删除位置L>dataj 1 = L>dataj;}L>length; //顺序表长度减少 1return 1;}```5、顺序表的查找操作```cint SearchList(SeqList L, int e) {for (int i = 0; i < Llength; i++){if (Ldatai == e) {//找到元素return i + 1;}}return 0; //未找到元素}```6、顺序表的遍历操作```cvoid TraverseList(SeqList L) {for (int i = 0; i < Llength; i++){printf("%d ", Ldatai);//输出顺序表中的元素}printf("\n");}```五、实验结果与分析1、测试创建顺序表```cSeqList L;InitList(&L);```创建成功,顺序表初始长度为 0。
实验一:线性表的基本操作【实验目的】学习掌握线性表的顺序存储结构、链式存储结构的设计与操作.对顺序表建立、插入、删除的基本操作,对单链表建立、插入、删除的基本操作算法。
【实验内容】1.顺序表的实践1)建立4个元素的顺序表s=sqlist[]={1,2,3,4,5},实现顺序表建立的基本操作.2) 在sqlist []={1,2,3,4,5}的元素4和5之间插入一个元素9,实现顺序表插入的基本操作。
3) 在sqlist []={1,2,3,4,9,5}中删除指定位置(i=5)上的元素9,实现顺序表的删除的基本操作。
2.单链表的实践3.1) 建立一个包括头结点和4个结点的(5,4,2,1)的单链表,实现单链表建立的基本操作。
2)将该单链表的所有元素显示出来。
3) 在已建好的单链表中的指定位置(i=3)插入一个结点3,实现单链表插入的基本操作。
4) 在一个包括头结点和5个结点的(5,4,3,2,1)的单链表的指定位置(如i=2)删除一个结点,实现单链表删除的基本操作。
5) 实现单链表的求表长操作.【实验步骤】1.打开VC++.2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK-〉finish。
至此工程建立完毕.3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File.给文件起好名字,选好路径,点OK。
至此一个源文件就被添加到了刚创建的工程之中.4.写好代码5.编译->链接->调试1、#include "stdio。
h”#include "malloc.h”#define OK 1#define OVERFLOW -2#define ERROR 0#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef int ElemType;typedef int Status;typedef struct {ElemType *elem;int length;int listsize;} SqList;Status InitList( SqList &L ) {int i,n;L。
一、实验目的:. 掌握线性表的逻辑特征. 掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算. 熟练掌握线性表的链式存储结构定义及基本操作. 理解循环链表和双链表的特点和基本运算. 加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决实际问题的编程能力二、实验内容:(一)基本实验内容(顺序表):建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:. 创建一个新的顺序表,实现动态空间分配的初始化;. 根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表;. 根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);. 利用最少的空间实现顺序表元素的逆转;. 实现顺序表的各个元素的输出;. 彻底销毁顺序线性表,回收所分配的空间;. 对顺序线性表的所有元素删除,置为空表;. 返回其数据元素个数;. 按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回;. 按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;. 判断顺序表中是否有元素存在,对判断结果进行返回;. 编写主程序,实现对各不同的算法调用。
2.实现要求:对顺序表的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价;. “初始化算法”的操作结果:构造一个空的顺序线性表。
对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;. “位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ;操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1;. “位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ;操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ;. “逆转算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换;. “输出算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行输出;. “销毁算法”初始条件:顺序线性表L 已存在;操作结果:销毁顺序线性表L;. “置空表算法”初始条件:顺序线性表L 已存在;操作结果:将L 重置为空表;. “求表长算法”初始条件:顺序线性表L 已存在;操作结果:返回L 中数据元素个数;. “按序号查找算法”初始条件:顺序线性表L 已存在,元素位置为i,且1≤i≤ListLength(L)操作结果:返回L 中第i 个数据元素的值. “按值查找算法”初始条件:顺序线性表L 已存在,元素值为e;操作结果:返回L 中数据元素值为e 的元素位置;. “判表空算法”初始条件:顺序线性表L 已存在;操作结果:若L 为空表,则返回TRUE,否则返回FALSE;分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
纟眇理工数学与计算科学学院实验报告实验项目名称:线性表的顺序表示和实现所属课程名称:数据结构A _________________实验类型:验证性________________________实验日期: _______班级:_________学号:—201044070218 _________姓名:_______ 张松涛_______________成绩:_____________________________、实验概述:【实验目的】(1)、线性表的逻辑结构特征。
①、总存在第一个和最后一个元素。
②、除第一个元素以外,每一个元素总存在唯一一个直接前驱元素。
③、除最后一个元素以外,每一个元素总存在唯一一个直接后驱元素。
⑵、顺序表的特征。
①、逻辑关系上相邻的物理位置上也相邻。
②、是一种随机存储结构,可以用一个简单直观的公式来表示每一个元素的地址。
(3)学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。
掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。
【实验原理】//——线性表的动态分配顺序存储结构--------------#defi ne LIST_INIT_SIZE 5 // 线性表存储空间的初始分配量#defi ne LISTINCREMENT 2 // 线性表存储空间的分配增量Typedef struct{ElemType *elem; // 存储空间基址int len gth; // 当前长度int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)}SqList;【实验环境】实验的环境:VC++、实验内容:【实验方案】编写主函数,调用初始化,建立顺序表的算法以及插入和删除算法。
调试运行输入数据得出结果并进行分析【实验过程】(实验步骤、记录、数据、分析)|叶《4* IHOt 1KOHl* fHl lf fl■tfer—«K li ■TT ST f RR«H nIKf KIBtf -1 i nr Sr ittif;apt K]t^pii ippr]utfiM u(r_inn_iiff,"删農存侶阿的杓站寸生量ITETHKfiTHFNT IQFwMpp*理)帼・:l*t l^njth■ill llwiliK;&u_)(•SUflllflCd-EST IHIT (FlfBlJIir) | ;iJ--4fl.rim) e<it(4MEflFLW|;LL .li«t5L7P=l.] £1 IINI I SIZE :[tltllst 耐tirntfiiD- vn«-tft K<I?, ip, "q :14 IIT Li^t U i a F1 ml yipr r J(1 F J -j f 4 II I'M lflMfl-fc-ii-Vl wbihrn fERM ・SiltlMi L LSI Ht 亂丿诉I*)41K1<1 11 ) rrtuim tRHBR;a 1194KliKt)<*«5«-俺]材加昶*)r »] )aa(L .#1 f L . ].lS(Si?e*L 1ST IMWMFHT ZP»f 4 EleRTyp* })if( tnii^dtwjiektt ・>:|| rll5tSiEe*-Ll$ I J HCfltKHI $k. elwuLL ..lrkg< ■"Wnr卜巩u ;+ "-L. Lr nr|C.h ;(MIE tt|:StitU% L"II#亍林•—聲(骑Ll钊U^ltt L.11 PHI v|itIFKKI) II 舁乳7"*4"和『HU阳EKIDI:pW 叭呵i- 1J>^q・L ■•丄w-L ilff*g|l.k-li―.Ipruft h;milrti}/vi 丸valid VU I H C)IE" uItiK1;I «r((surtff 'Ur .U ,eke«(f )p; L .>PFiintrr'td w»i|T imwr f;网■,刮.b); LisHlrH-rr t_En(L 4l H.rj;f<jp| 1»*;1 (f.叶枇.31«■> printF<"1bri MB, *(1 ;■dm刊rm;, 1 ,»);.priRtF4>!%4 ;将源程序输入VC6.0Lk卄LrL-Unll||UF**l(*; 1 -灯#2 弁----------------- -- --- —----- “tMipELlni .・< Mri xelUnyi^difebiiijfti^lti'M .uptf l^fYlrrv 版IM煮■UiriEAft丄*科ItfHtiHfr^-:\dKurmts- ±nd ictLinqs'iiKtaLnlstj'jtiM'XI上z mrnr CSBK: "EEt*R" ; ukfccl-H-rd adMllfirr lErrir rkrcti^l>g Ci^nr^iLnhj ・1 err writ),. ■发现有OVERFLOW : undeclared identifier ,错误,是没有定义导致加入宏替换定义OVERFLOW1^™-™-=-=-"=-=^^——-C»nfi|UFitii*3 1 - ■i«32i Ir眄l h•打i»1 .£ibj -・Mr甘忖F ■ji编译之后没有发现语法错误-»"-■■■■■-- ----- l^urKluiiia ii - trtn3£■ -■ ■»»w«Liifting __1 - tie - ■ rnrurts) B• wriaikf(和连接没问题,直接运行【实验结论】(结果)【实验小结】(收获体会)1. 实验要细心,认真。
数据结构实验研究报告线性表的顺序表示和实现————————————————————————————————作者:————————————————————————————————日期:数学与计算科学学院实验报告实验项目名称:线性表的顺序表示和实现所属课程名称:数据结构A实验类型:验证性实验日期:2012年4月5号班级:信管10-02班学号:201044070218姓名:张松涛成绩:一、实验概述:【实验目的】(1)、线性表的逻辑结构特征。
①、总存在第一个和最后一个元素。
②、除第一个元素以外,每一个元素总存在唯一一个直接前驱元素。
③、除最后一个元素以外,每一个元素总存在唯一一个直接后驱元素。
(2)、顺序表的特征。
①、逻辑关系上相邻的物理位置上也相邻。
②、是一种随机存储结构,可以用一个简单直观的公式来表示每一个元素的地址。
(3)学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。
掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。
【实验原理】//--------线性表的动态分配顺序存储结构-----------#define LIST_INIT_SIZE 5 //线性表存储空间的初始分配量#define LISTINCREMENT 2 //线性表存储空间的分配增量Typedef struct{ElemType *elem; //存储空间基址int length; //当前长度int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)}SqList;【实验环境】实验的环境:VC++二、实验内容:【实验方案】编写主函数,调用初始化,建立顺序表的算法以及插入和删除算法。
调试运行输入数据得出结果并进行分析。
【实验过程】(实验步骤、记录、数据、分析)将源程序输入VC6.0发现有OVERFLOW' : undeclared identifier,错误,是没有定义导致。
实验一线性表的顺序存储一、实验说明实验项目名称:线性表的顺序存储实验类型:基础实验课时:2实验所用主要仪器:微型计算机1台,安装中文版Windows 2000/XP 操作系统、VC++6.0集成编程环境。
二、实验目的:1. 掌握线性表的顺序存储结构。
2. 利用顺序存储结构实现线性表的基本操作。
3. 了解线性表的应用。
三、实验内容1. 运行顺序表的演示程序,掌握顺序表的存储结构的实现,进一步了解顺序表的初始化、查找、插入、删除、销毁等算法的编程实现。
(请运行源程序,写出创建线性表以及线性表的插入、删除、查找等一组测试结果)2. 按课本P43题2.6的要求,在演示程序中增加顺序表逆置功能。
本题要求:(1) 写出顺序表逆置算法加入到程序中并上机验证通过。
(2) 设计一组测试数据,并测试程序各个功能,记录输出结果。
(请查看源码中的reverse(L)函数)3. 约瑟夫圈问题:假设有n个人按1、2、3、…、n的顺序围成一圈。
现在,从第s个人开始按1、2、3、…、m的顺序报数,数到m的人出圈,接着从出圈的下一个人开始重复此过程,直到所有人出圈为止。
求出所有人的出圈顺序。
本题解法1:用顺序表为数据结构来解决这个问题。
算法如下:可以将n个人的编号存入一个一维数组中,表的长度就是人数n,因此,就可以用一维数组来代替顺序表。
算法的思想是:先求出出圈人的编号,用一个临时单元保存它,然后从出圈人的后一个开始,直到最后一个,都按顺序向前移动一个位置,再将临时单元的出圈人编号存入最后。
当这个重复步骤完成后,数组中存放的是出圈人的逆序列。
本题中,围圈的人数n、出圈的报数号m、开始报数的位置s,在程序中预先给定为10、3、2。
当然,用户也可以从键盘临时输入。
本题提供源程序。
(请查看源码中的joes(int n,int s,int m)、joes1(SqList &a,int n,int s,int m)、joes2(SqList a,int n,int s,int m)函数,对比两种方法解决约瑟夫问题的优劣性)本题要求:要求在main函数中修改joes、Joes1函数,设计出至少三组不同的测试数据(对应三个变量人数n、报数号m、开始位置s),记录输出结果。
实验2.1 线性表(顺序表实现)的基本操作及其应用一、实验目的1、帮助读者复习C语言程序设计中的知识。
2、熟悉线性表的逻辑结构。
3、熟悉线性表的基本运算在顺序表结构上的实现。
4、掌握顺序表的存储结构形式及其描述和基本运算的实现。
二、实验内容[问题描述]实现顺序表的建立、求长度,取元素、修改元素、插入、删除等顺序表的基本操作。
[基本要求](1)实现顺序表初始化操作;(2)实现插入元素的操作;(3)实现删除元素的操作;(4)实现更改元素的操作;(5)实现获取顺序表长度的操作;(6)实现获取元素的操作。
[代码模板]1.顺序表数据类型:#define ListSize 10typedef int DataType;typedef struct{DataType data[ListSize];int length;}SeqList;三、源代码void initList(SeqList * L){L=(SeqList*)malloc(sizeof(SeqList));L->length=0;}void insertList(SeqList * L, DataType x, int i){int j;for (j=L->length-1; j>=i-1; --j)L->data[j+1]=L->data[j];L->data[i-1]=x;++L->length;}void deleteList(SeqList * L, int i){int j;for (j=i; j<L->length; ++j)L->data[j-1]=L->data[j];--L->length;}void updateList(SeqList * L, DataType x, int i) {L->data[i-1]=x;}int getLength(SeqList * L){return L->length;}DataType getElem(SeqList * L, int i){return L->data[i-1];}四、测试结果五、心得体会因为已经给了模板,所以我只需要将函数填好就可以了,同时帮助我复习C语言程序设计中的知识。
线性表的顺序存储结构顺序存储结构封装需要三个属性:1.存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置2.线性表的最⼤存储容量,数组的长度MaxSize3.线性表的当前长度:length当前长度与数组长度区别:数组长度就是该顺序表的总长度,如果不进⾏扩容的话,就是不变的。
⽽当前长度在数据的变化中,就会发⽣相应的变化。
PS:线性表是正常的读数⽅法,⼀下标1开始的。
存储时间性能:O(1)性能:存取以及读取不管是在哪个位置,其时间复杂度都是O(1),⽽在插⼊还是删除其时间复杂度都是O(n)结论:⽐较适合数据的存取⽽不适合经常性增删的情况。
顺序存储结构的优缺点1.优点:- ⽆须为表⽰表中元素之间的逻辑关系⽽增加额外的存储空间- 可以快速的存取表中任意位置的元素。
2.缺点:- 插⼊以及删除操作需要移动⼤量的元素。
- 当线性表长度变化较⼤时,难以确定存储空间的容量。
- 容易造成存储空间的碎⽚。
具体代码的实现:// 头⽂件部分,进⾏常量参数初始化#define LIST_INT_SIZE 10 //线性顺序表初始动态分配内存⼤⼩#define INCREAMENT 2 //线性表扩容⼀次性增量#define OK 1#define ERROW -1#define OVERFLOW -2#include<stdio.h>#include <stdlib.h>//malloc函数包含在其中typedef int Elemtype; //线性表的数据类型typedef int Status; // 状态数据类型// 顺序表存储结构定义typedef struct {Elemtype *elem; //定义线性表内数据元素的数据类型int length; //表当前长度int listsize; //表当前空间容量⼤⼩} SqList; //表名// 初始化⼀个顺序表Status InitList(SqList &L) {L.elem = (Elemtype *)malloc(LIST_INT_SIZE * sizeof(Elemtype)) ;//动态分配内存,分配后可以将l.elem作为数组使⽤if(!L.elem) { //对内存分配的结果判断exit(OVERFLOW);} //这个地⽅可以去查⼀下资料// if(L.elem == NULL) {// printf("分配内存失败")// exit(1);// }//关于内存分配结果的判断,⼜该如何去进⾏判断//这种⽅法进⾏判断⼜是否正确L.length = 0; //对表长初始化归0L.listsize = LIST_INT_SIZE;return OK;}// 创建⼀个顺序表Status CreateList(SqList &L) {int i;InitList(L);printf("请输⼊元素个数:\n");scanf("%d",&L.length);printf("\n请输⼊您要输⼊的元素\n");for(i=0; i<L.length; i++) {scanf("%d",&L.elem[i]);}printf("顺序表已创建成功,打印表请选择功能 *3\n");return OK;}// 顺序表的遍历Status TraverseList(SqList &L) {int i;printf("表中元素为:\n");for(i=0; i<L.length; i++)printf("%d ",L.elem[i]);printf("\n\n顺序表输出完毕!\n");}//顺序表的插⼊// 表L 位置 i Elemtype 要插⼊的元素Status InsertList(SqList &L,int i,Elemtype e) {int* newbase;int j;if(i < 1 ||i > L.length+1) { // 判断所要插⼊的位置return ERROW;}if(L.length>=L.listsize) {newbase = (Elemtype*)realloc(L.elem,(L.listsize+INCREAMENT)*sizeof(Elemtype)); if(!newbase) {exit(OVERFLOW);}L.elem = newbase;L.listsize += INCREAMENT;}for(j = L.length-1; j>i-1; j--) {L.elem[j+1]=L.elem[j];}L.elem[i-1] = e;L.length++;return OK;}//删除指定位置元素并返回出来Status deleteListElem(SqList &L,int i) {Elemtype e;int j;if(i<1 || i>L.length) {return ERROW;}e = L.elem[i-1];for(j = i-1 ; j<=L.length; j++) {L.elem[j] = L.elem[j+1];}L.length--;return e;}//判断⼀个值是不是线性表中的元素并返回第⼏个元素Status ifElemExit(SqList &L,Elemtype e) {int i = 0;for(; i<L.length; i++) {if(e==L.elem[i])break;}if(i>=L.length) {return ERROW;} else {return i;}}//输出⼀个位置的数据元素Status GetElem(SqList &L,int i) {if(i<1||i>L.length) {return ERROW;}return L.elem[i-1];}//根据元素的值来进⾏删除Status deleteElemByR(SqList &L,Elemtype e) {int i = 0;i = ifElemExit(L,e);if(i==-1) {printf("该值不再线性表中:");return ERROW;} else {deleteListElem(L,i+1);printf("删除成功!删除的是位置为%d,值为%d",i,e);return OK;}}//将线性表进⾏递减排序操作Status SortByMao(SqList &L) {Elemtype e;for(int j=0; j<L.length; j++) {for(int i=0; i<L.length-i-j; i++) {if(L.elem[i]<L.elem[i+1]) {e = L.elem[i];L.elem[i] = L.elem[i+1];L.elem[i+1]=e;}}}}void UnionTwo(SqList &la,SqList &lb) {int la_length = la.length;int lb_length = lb.length;for(int i=1;i<=lb.length;i++){Elemtype e= GetElem(Lb,i);if(ifElemExit(La,e)==-1){InsertList(La,la_length,e);la_length++;la.length++;}}}/***主提⽰输出函数***/void printlin() {printf("\n");printf("\t\t\t线性顺序表基本操作学习系统\n");printf("\t\t\t ***主菜单***\n\n");printf("\t\t\t *1 创建⼀个顺序表\n");printf("\t\t\t *2 定位输出⼀个数据元素\n");printf("\t\t\t *3 输出顺序表中所有元素\n");printf("\t\t\t *4 定位插⼊⼀个数据元素\n");printf("\t\t\t *5 定位删除⼀个数据元素\n");printf("\t\t\t *6 定值删除⼀个数据元素\n");printf("\t\t\t *7 清空顺序表\n");printf("\t\t\t *8 销毁顺序表\n");printf("\t\t\t *9 对表内数据元素进⾏⾮递减排序\n");printf("\t\t\t *0 结束程序\n");}//清空线性表void clearList(SqList &L) {if(L.length!=0) {L.length = 0; //由于顺序表的⽤得是与数组⼀样的内存空间,//所以标的清空只要将表长归零即可,由此可见,表长是线性表⾮常重要的部分 }}//销毁线性表void destoryList(SqList &L) {if(L.length!=0) {free(L.elem);L.elem = NULL;//使⽤free后就需要对元素进⾏赋空操作}}int main() {int i,j,k;Elemtype e;SqList L;L.length=0;printf("编写此程序⽬的是⾃我学习线性表顺序表\n");printlin();while(1) {int t;scanf("%d",&t);if(t!=0)if(t==1||L.length!=0) {switch(t) {case 1:if(L.length!=0) {printf("顺序表已存在,是否重新创建顺序表?\n");printf("*1 是 *2 否\n");scanf("%d",&i);if(i==1)CreateList(L);} elseCreateList(L);break;case 0:break;case 3:TraverseList(L);break;case 7:clearList(L);printf("清空完毕,返回主菜单\n\n");break;case 4:printf("输⼊要插⼊的位置\n");scanf("%d",&i);printf("请输⼊要插⼊的数据\n");scanf("%d",&j);k=InsertList(L,i,j);if(k==-1) {printf("插⼊位置不合法,插⼊数据操作失败!\n\n");} elseprintf("插⼊数据成功\n\n");break;case 5:printf("请输⼊要删除数据位置\n");scanf("%d",&i);e = deleteListElem(L,i);printf("删除掉的元素是第%d个位置,它的值是%d",i,e); break;case 2:printf("请输⼊要需要得到数据位置:");scanf("%d",&i);e = GetElem(L,i);printf("第%d个位置上的元素值为:%d",i,e);break;case 6:printf("请输⼊需要删除的值:");scanf("%d",&e);deleteElemByR(L,e);break;case 8:destoryList(L);printf("销毁成功!");break;case 9:SortByMao(L);break;default: {printf("输⼊有误,可以重新选择,退出按0!\n");}}} elseprintf("顺序表未创建或已清空或销毁,请先创建顺序表\n"); system("pause");system("CLS");printlin();if(t==0)break;}return 0;}。
1
**大学实验报告
学院: 专业: 班级:
姓名 学号 实验组
实验时间 指导教师 成绩
实验项目名称
实验一 线性表的顺序存储结构
实
验
目
的
1. 熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;
2. 以线性表的各种操作(建立、插入、删除等)的实现为重点;
3. 掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;
实
验
要
求
1、 独立完成实验,并认真撰写实验报告
2、分析试验中出现的问题,并找出原因
实
验
原
理
线性表顺序存储结构的初始化、遍历、插入、删除算法的程序编写及运用
实
验
仪
器
运行Visual c++的微机一台
实验步骤 1、分别编写线性表顺序结构的初始化、遍历、插入、删除的程序
2、编写一个主程序来调用初始化、遍历、插入、删除函数
3、运行程序,并记录运行过程中出现的问题,进行分析和解决
4、撰写实验报告
实
验
内
容
1.输入一组整型数据,建立顺序表。
2.实现该线性表的遍历。
3.实现该线性表的删除。
4、实现该线性表的插入。
5、编写一个主函数,调试上述算法。
2
实
验
数
据
程序:
#include
#include
typedef int Elemtype;
struct list{
Elemtype *elem;
int size;
int maxsize;
};
void initlist(list &l) //线性表的初始化
{
cout<<"线性表的初始化!"<
l.elem=new Elemtype[l.maxsize];
if(l.elem==NULL)
{
cout<<"动态分配空间失败!"<
}
l.size=0;
}
bool insertlist(list &l,Elemtype item,int pos) //在线性表中插入元素
{
//cout<<"对任意的线性表中任意大位置插入任意的元素"<
{
cout<<"插入的位置非法!"<
}
if(l.size==l.maxsize)
{
int k=sizeof(Elemtype);
l.elem=(Elemtype *)realloc(l.elem,2*l.maxsize*k);
if(l.elem==NULL)
{
cout<<"分配空间不成功!"<
}
l.maxsize=2*l.maxsize;
}
for(int i=l.size-1;i>=pos-1;i--)
{l.elem[i+1]=l.elem[i];}
l.elem[pos-1]=item;
l.size++;
return true;
}
void traverselist(list l) //线性表遍历
{
for(int i=0;i
bool deletelist(list &l,int pos) //删除线性表中的元素
{
cout<<"删除线性表中的任意元素"<
{
cout<<"pos值无效!"<
}
if(l.size==0)
3
{
cout<<"线性表为空表!"<
}
for(int i=pos;i
l.size--;
if(float(l.size)/l.maxsize<0.4&&l.maxsize>10)
{
int k=sizeof(Elemtype);
l.elem=(Elemtype *)realloc(l.elem,l.maxsize*k/2);
l.maxsize=l.maxsize/2;
}
return true;
}
void display(list l)
{
cout<
cout<<"输出第"< cout<
}
void main()
{
int a[5];
int i;
Elemtype x;
list k;
cout<<"请输入线性表元素:"<
cin>>a[i];
cout<
traverselist(k);
for(i=0;i<5;i++)
insertlist(k,a[i],i+1);
traverselist(k);
cout<<"插入一个位置:"<
cout<
traverselist(k);
cout<<"插入一个元素:"<
cout<
traverselist(k);
cout<<"删除一个位置的元素:";
cin>>x;
if(deletelist(k,x))
cout<<"删除成功!"<
}
运行结果:
4
实验总结 1、线性表的初始化为一个空表时,要明确给空(l.list==NULL)
2、线性表的插入、删除操作前都要进行非法位置的剔除
3、插入、删除等操作非法时,一定要有返回值(return false),否则操作会出现错误
4、程序编写过程中,要注意细节部分,减少错误的产生,减少调试时间
指导教师意见
签名: 年 月 日
注:各学院可根据教学需要对以上栏木进行增减。表格内容可根据内容扩充。