2.2 线性表的顺序表示和实现
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。
假设线性表的每个元素需占用 l 个存储单元,并以所占的第一个单元的存储地址作 为数据元素的存储位置。则线性表中第 i+l 个数据元素的存储位置 LOC(a.+1) 和第 i 个 数据元素的存储位置 LOC(a, )之间满足下列关系:
L
O
C
(
a
i
+
1
)
=
L
O
C
(
a
i
)
+
l
L O C ( a _ { i + 1 } ) = L O C ( a _ { i } ) + l
LOC(ai+1)=LOC(ai)+l
一般来说,线性表的第 i 个数据元素 ai的存储位置为
L
O
C
(
a
i
)
=
L
O
C
(
a
i
)
+
(
i
−
1
)
×
l
L O C ( a _ { i } ) = L O C ( a _ { i} ) + ( i - 1 ) \times l
LOC(ai)=LOC(ai)+(i−1)×l
式中LOC(a1)式线性表的第一个数据元素a1的存储位置,通常称做线性表的起始位置或基地址
顺序表特点:随机存取
数组类型也有随机存取的特性,所以通常使用数组来描述数据结构中顺序存储结构。因为线性表长度可变吗,所以需要使用动态分配的一维数组
//-----线性表的动态分配顺序存储结构------
#define LIST_INTIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCRMENT 10//线性表存储空间分分配增量
typedef struct{
ElemType *elem; //存储空间地址
int length; //当前长度
int Listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
//向线性表中插入一个数据元素,插入位置之后的元素依次先后移动一个位置
Ststus ListInsert_Sq(SqList &L,int,ElemType e){
//在顺序线性表L中第i个位置之前插入新的元素e
//i的合法值为1<=i<=ListLength_Sq(L)+1
if(i<1||i>L.length+1)return ERROR; //i值不合法
if(L.Length>=L.listsize){ //当前存储空间已满,增加分配
newbase=(ElemType *)realloc(L.elem,(L. listsize + LISTINCREMENT) * sizeof (ElemType));
if (! newbase)exi七 (OVERFLOW); //存储分配失败
L. elem = newbase; //新基址
L. listsize + = LISTINCREMENT; //增加存储容量
}
q = &. (L. elem[i - 1]); // q 为插入位置
for (p = &. (L. elem[L. length- l]); p >= q; -- p) * (p + 1) = * p; //插入位置及之后的元素右移
*q = e; // 插入 e
++L.length; // 表长增 1
return OK;
}// ListInsert_Sq