首页 > 编程知识 正文

顺序表的基本操作实验总结,顺序表的基本操作实验原理

时间:2023-05-06 20:37:52 阅读:190485 作者:213

文章列表1、线性列表定义2、线性列表顺序存储结构1 .定义2 .属性3 .区别4 .地址计算方法3、顺序列表基本操作1 .初始化2 .插入操作3 .删除操作4 .搜索操作5 .优缺点4、顺序存储和连锁存储的区别

一.定线表定义

路线图:零个或多个数据元素的有限序列。

注意:元素之间有顺序,并且是有限的。

如图所示

线性表元素的个数n(n=0)定义为线性表的长度,当n=0时,称为空表。 I是线性表中数据元素ai的顺序。

在复杂的线性表中,一个数据元素可以由多个数据项组成

二.线性列表顺序记忆结构1 .定义线性列表的顺序记忆结构。 在地址连续存储单元中依次存储线性列表的数据要素.

如图所示

2 .属性可以通过C语言的一维数组实现序贯记忆结构。

线性表顺序存储结构代码:

# define maxsize 20 typedefintelemtype; typedef struct { elemtype data [ maxsize ]; int length; }SqList; 这里补充typedef的使用方法

typedef的4种用法

(1) 为基本数据类型定义新的类型名;

(2) 为自定义数据类型(结构、联合体和枚举类型)定义简洁的类型名称;

以结构为例,定义名为Point的结构,如下所示:

结构点{ double x; 双y; 双z; (; 调用此结构时,必须调用此结构,如以下代码所示:

sructpointopoint1={ 100,100,0 }; struct Point oPoint2; 在此,结构体struct Point是新的数据类型,在定义变量时,像上述的调用方法一样需要保留字struct,不能像int和double那样直接使用Point来定义变量。 现在,使用typedef定义此结构,如以下代码所示:

typedef struct tagPoint{ double x; 双y; 双z; } Point; 在上面的代码中,实际上完成了两个操作。

1 .定义了新的结构类型。 代码如下所示。

struct tagPoint{ double x; 双y; 双z; (; 其中,struct关键词与tagPoint一起构成该结构型,无论有无typedef关键词都存在。

2、使用typedef给这个新结构取了一个别名Point。 也就是说:

typedef struct tagPoint Point因此,您现在可以直接使用Point定义变量,如int和double所示,如以下代码所示:

pointopoint1={ 100,100,0 }; Point oPoint2;(3) 为数组定义简洁的类型名称

定义方法很简单,就像为基本数据类型定义新的别名方法一样,示例代码如下所示:

typedef int INT_ARRAY_100[100]; INT_ARRAY_100 arr;(4) 为指针定义简洁的名称

顺序存储结构的三个属性:

(1)存储空间的开始位置:排列data;

)2)线性表最大存储容量:数组长度MAXSIZE;

)3)线性表当前长度: length。

3 .注意区分排列长度和线性表长度。

如图所示

数组的长度(存储线性表的存储器区域的长度)在存储器分配后,一般不变的线性表的长度)线性表内的数据要素的个数)可以通过线性表的插入和删除操作在任意时刻变更,线性表的长度不超过数组的长度4 地址计算方法定义:存储器内的每个存储单元都有自己的号码,这个号码叫做地址。 路线图的第I个元素存储在阵列下标为i - 1的位置。 请参阅上图。 假设一个数据元素占用c个存储单元,则第3358www.Sina.com/个数据元素存储单位与第i + 1个数据元素的存储单位的位置关系是LOC(AI ) )=loc=lom

i第个元素ai的存储位置: loc(AI )=loc ) a1 ) (i-1 ) ) c

如图所示

三.顺序表基本操作1 .初始化思路

将动态分配数组空间的表的当前长度设置为0的代码如下

statusinitlist(sqlistL ) {L.elem=new ElemType

[MAXSIZE];if(!L.elem) exit(OVERFLOW);L.length = 0;return OK;}

return和exit的区别

return返回函数值,是关键字exit是一个函数return是函数的退出exit是进程的退出 2.插入操作

思路

如果插入位置不合理,或者线性表长度大于等于数组长度,应抛出异常从最后一个数开始向前遍历到第 i 个位置,分别将他们向后移动一个位置将插入元素填在 i 处位置表长加一

代码如下

Status ListInsert(SqList *L, int i,ElemType e){int k;if(l->length==MAXSIZE) //线性表已满return ERROR;if(i < 1|| i > l->length + 1) //i不在范围内return ERROR;if(i<=l->length){for(k=l->length-1;k>=i-1;k--)l->data[k+1]=l->data[k]; } l->data[i-1]=e; //将新元素插入 l->length++; return OK;} 3.删除操作

思路

如果删除位置不合理,抛出异常取出删除元素将删除元素后面的元素全都向前移动一个位置表长减一

代码如下

Status LisDelete(SqList *L, int i,ElemType *e){int k;if(l->length==0) //线性表为空 return ERROR;if(i < 1|| i > l->length) //删除位置不正确 return ERROR;*e = l->data[i-1]; if(i<l->length){for(k=i;k<l->length;k--)l->data[k-1]=l->data[k]; } l->length--; return OK;} 4.查找操作

思路

从第一个元素开始查找,若找到,返回该元素的序号若遍历全部序列没有找到,则返回0

代码如下

int LocateElem(SqList l,ElemType e){for(i = 0; i < l.length ;i ++)if(l.elem[i]==e) return i+1;return 0; } 5.优缺点 优点缺点可快速随机存取任意元素插入和删除操作需要移动大量元素逻辑关系相邻,物理位置相邻分配空间需按固定大小分配,利用不充分无需为表示元素之间的逻辑关系而增加额外的存储空间当线性表长度变化较大时,难以确定存储空间的容量 四,顺序存储和链式存储的区别 链表存储结构的内存地址不一定是连续的,但顺序存储结构的内存地址一定是连续的;链式存储适用于在较频繁地插入、删除、更新元素时,而顺序存储结构适用于频繁查询时使用。顺序存储结构和链式存储结构的优缺点:
(1)空间上: 顺序比链式节约空间。是因为链式结构每一个节点都有一个指针存储域。
(2)存储操作上:顺序支持随机存取,方便操作
(3)插入和删除上:链式的要比顺序的方便(因为插入的话顺序表也很方便,问题是顺序表的插入要执行更大的空间复杂度,包括一个从表头索引以及索引后的元素后移,而链表是索引后,插入就完成了)

参考文献
http://c.biancheng.net/view/298.html
《大话数据结构》执着的曲奇

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。