#数据结构

来源:互联网 发布:hao123网络连接错误 编辑:程序博客网 时间:2024/06/09 17:17

2.2线性表的顺序存储和基本操作

在计算机内,可以用不同的方式来存储线性表,其中最常用的方式有顺序存储(sequential list)和链式存储(linked list)两种。

2.2.1线性表的顺序存储——顺序表


1、定义

顺序存储:用一段地址连续的存储单元依次存储线性表里各元素。也就是将线性表中的元素一个挨着一个的存放在某存储区域中,这种存储方式称为线性表的顺序存储结构。

顺序表:采用顺序存储结构的线性表称为顺序表。


2、我们用一维数组来描述顺序表中数据元素的存储区域,即用数组中相邻的位置存储线性表中相邻的元素。

C语言中,数组的下标是从0开始的,因此,线性表中第i个元素存储在数组下标为i-1的位置。

然而,用数组存储线性表意味着要分配固定长度的数组空间,而线性表可以进行插入和删除操作,即线性表的长度要求是可变的,因此,首先分配的数组空间要大于线性表的长度,其次,还需要设立一个变量,表示线性表的当前长度


3、线性表中第i个元素ai的存储首址为:loc(ai)=loc(a1)+(i-1)*k(1<=i<=n)。

其中,k表示每个数据元素占用的存储单元

loc(ai)表示数据元素ai的存储首址

上式表明,线性表中每个数据元素的存储首址都与第一个元素的存储首址loc(a1)相差一个与序号成正比的常数。

利用此公式,访问表中任意元素所需时间都相等,具有这一特点的存储结构称为随机存储结构。


4、根据存储分配的不同,顺序表仍可做进一步划分——静态存储分配的顺序表和动态存储分配的顺序表

1)静态存储分配的顺序表。

特点:表的空间大小固定,给表的插入操作带来不便。

其结构描述为:

#define LIST_INIT_SIZE 100     //顺序表的最大容量(100)

typedef struct{

ElemType elem [LIST_INIT_SIZE];      //存储数据元素的一维数组

int length;                      //线性表的当前长度

}SSqList;                                  //静态顺序表

2)动态存储分配的顺序表。

特点:在操作过程中可以随时向系统重新申请增补空间,非常灵活实用。

其结构描述为:

#define LIST_INIT_SIZE 100   //顺序表(默认的)初始分配最大容量

#define LISTINCREMENT 10  //(默认的)增补空间量

typedef struct{

ElemType *elem;//存储数据元素一维数组

int length;                       //线性表的当前长度

int listsize;               //当前分配的数组容量(以ElemType为单位?

int incrementsize;     //增补空间量(ElemType为单位

}SqList;                         //动态顺序表

注意:

1)ElemType是一个抽象的数据类型,实际应用时,应根据数据元素的特征具体定义,int,char。。。。

2)在上述定义中,elem、lengthlistsize、incrementsize都是结构体中的成员,不能单独使用。若有定义:SqList L;则L表示一个顺序表,elem的引用方式为:L.elem。

3)在线性表中“第i个位置的元素”存放在数组元素L。elem[i-1]中,因此,在其后有关顺序存储结构的各操作实现中,元素的位序都从0开始(?)。

4)辨析存储结构和存取结构

***存储结构是数据及其逻辑结构在计算机中的表示

***存取结构是在某种数据结构上对查找操作时间性能的描述。

“顺序表是一种随机存取的存储结构”的含义为:在顺序表这种存储结构上进行查找操作,其时间性能为O(1)。