实验报告 线性表的顺序存储结构
顺序表的基本操作实验报告

顺序表的基本操作实验报告一、实验目的本次实验旨在深入理解和掌握顺序表的基本操作,包括顺序表的创建、插入、删除、查找和遍历等功能,并通过实际编程实现,加深对数据结构中顺序存储结构的理解和应用能力。
二、实验环境本次实验使用的编程语言为 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;分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
线性表的顺序存储结构

相邻两个数据元素的存 储地址之间的关系: LOC(ai+1)=LOC(ai)+k
第i个数据元素ai的存储地址: LOC(ai)=LOC(a1)+(i-1)×k
线性表的顺序存储结构是一种随机存取的存储结构。
若已知线性表的起始位置(基地址)和表中每个数据元素所占 存储单元的大小k,就可以计算出线性表中任意一个数据元素 的存储地址,这种存取元素的方法称为随机存取法
对表中数据元素进行操作应使用L.elem[i] 方法二:SeqList *L,表示将L定义为指向SeqList类型的指针。
对表中数据元素进行操作应使用L->elem[i]
二、顺序表的基本操作
1.初始化顺序表 2.插入数据元素 3.删除数据元素 4.查找数据元素
1.初始化顺序表
初始化顺序表操作是指构造一个空的顺序表,并为其分配存储空间。 其算法描述如下:
while (item >= L.elem[i]) //寻找item的插入位置i
i ++;
ListInsert (&L, i, item); } //将item插入到位置i
L.length ++; }
//表长增1
数据结构
//表长增1
return TRUE; }
假设在顺序表中第i个位置插入一个元素的概率为pi,则在长度为n的 线性表中插入一个数据元素时,需要移动其他元素的平均次数为:
该算法的时间复杂度为O(n)。
3.删除数据元素
删除顺序表中第i(1≤i≤n)个 数据元素,需将第i+1个至第n 个元素(共n-i个)依次向前 移动一个位置。顺序表进行删 除操作的前后,其数据元素在 存储空间中的位置变化如图2-3 所示。
数据结构实验研究报告线性表的顺序表示和实现

纟眇理工数学与计算科学学院实验报告实验项目名称:线性表的顺序表示和实现所属课程名称:数据结构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),记录输出结果。
数据结构实验1线性表(顺序表)

void creat_sq(Sqlist *L)
{
int tablen,i=0;
ElemType temp;
printf("please input the table length\ห้องสมุดไป่ตู้");
scanf("%d",&tablen);
printf("please input a serial number\n");
printf("X=EXIT,C=CREAT,P=DISPLAY,I=INSERT,S=SEARCH,D=DELETE\n");
break;
case 'P':
case 'p':
display_sq(&L1);
printf("X=EXIT,C=CREAT,P=DISPLAY,I=INSERT,S=SEARCH,D=DELETE\n");
break;
case 'I':
case 'i':
printf("please input the number to be inserted,D=DELETE\n");
scanf("%d",&temp);
printf("please input the position to be inserted(1~100)\n");
(2)下面是一个不太完整的的源程序,目的为学生提供一个示范,供学生参考。
线性表的顺序存储结构,顺序表类。本程序的特点是,数据元素的类型不再是简单类型(int,char,float),而是更加接近使实用的比较复杂的结构体类型。在数据元素输入输出时,情况比较复杂一些。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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、程序编写过程中,要注意细节部分,减少错误的产生,减少调试时间
指导教师意见
签名: 年 月 日
注:各学院可根据教学需要对以上栏木进行增减。表格内容可根据内容扩充。