|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1 U: R, T) C3 S3 n3 l: d! ~
线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素。
3 E/ V5 j* N: \+ C+ p P9 t! Q假设线性表的每个元素需占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置LOC(ai)之间满足下列关系:# l7 z" Z3 ?8 b0 X% d1 h
LOC(ai)= LOC(ai)+l5 U, o" ~* G% w; h9 ?4 _, ^0 l7 D, d
一般来说,线性表的第i个数据元素ai的存储位置为& q% ]9 V+ D! R( ?6 q
LOC(ai)= LOC(ai)+(i-1)×l
4 t# F( \ t" W式中LOC(ai)是线性表的第一个数据元素ai的存储位置,通常称作线性表的其实位置或基地址。5 m$ q; n/ r5 n/ j
线性表的这种机内表示称做线性表的顺序存储机构或顺序映像,通常,称这种存储结构的线性表为顺序表。它的特点是,为表中相邻的元素ai和ai+1赋以相邻的存储位置LOC(ai)和LOC(ai+1)。换句话说,每一个数据元素的存储位置都和线性表的起始位置相差一个和数据元素在线性表中的位序成正比的常数。由此,只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。8 p) c. y* M3 ?7 M4 Z8 G' g; _
由于高级程序设计语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的顺序存储结构。在此,由于线性表的长度可变,且所需最大存储空间随问题不同而不同,则在C语言中可用动态分配的一维数组,如下描述。. A c8 }( Y. ^1 |, v. I' y5 g4 b
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量3 ]8 j9 c I/ f
#define LISTINCREMENT 10 //线性表存储空间的分配增量
; |1 G% ^) I; m7 @typedef struct{
6 N, c& w7 b* J4 V' J; m {- ~1 e ElemType *elem; //存储空间基址
# l: z- f, N0 y2 l int length //当前长度2 v; c% D7 j/ f0 c
int listsize; //当前分配的存储容量
$ O& G9 B: T- b6 f. j& q a& p* F}SqList;/ g ], ~' `+ c5 m7 q; {! g
在上述定义中,数组指针elem指示线性表的基地址,lenth指示线性表的当前长度。顺序表的初始化操作就是为顺序表分配一个预定义大小的数组空间,并将线性表的当前长度设为“0”。Listsize指示顺序表当前分配的存储空间大小,一旦因插入元素而空间不足时,可进行再分配,即为顺序表增加一个大小为存储LISTINCREMENT个数据元素的空间。1 k; u$ d# C5 ]" k% {2 o# ^
Status InitList——Sq(SqList 7L){+ j& P* [! _) }" {6 R4 k [
//构造一个空的线性表L。
n" i3 P5 L- B' WL.elem=(ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType));
3 `. M" E9 J; ~, S; SIf(! L.elem)exit(OVERFLOW); //存储分配失败
0 D: ~% }: U, U ?! m1 }L.length=0; //空表长度为0; S3 W0 r( }# s3 P9 @
L.listsize= LIST_INIT_SIZE; //初始存储容量( y! u* o; A/ d& M' }7 f% ]5 x! O
return OK;
" [) k. [- L& `' s7 h}//InitList_Sq |
|