1.2 线性表的顺序存储结构

顺序表:用一组地址连续的存储单元依次存放线性表中的数据元素。


存取结构<--不等于-->存储结构:
存取结构:在一个数据结构上对查找操作的时间性能的一种描述。
通常有两种存取结构:随机存取结构和顺序存取结构。


随机存取结构是指在一个数据结构上进行查找的时间性能是O(1),即查找任意一个数据元素的时间是相等的,
均为常数时间,例如顺序表是一种随机存取结构。
顺序存取结构是指在一个数据结构上进行查找的时间性能是O(n),即查找一个数据元素的时间复杂度是线性的,
与该元素在结构中的位置有关,例如单链表是一种顺序存取结构。


线性表的静态分配顺序存储结构:


#define LISTSIZE 100 //存储空间的最大分配量
typrdef struct{
ElemType elem[LISTSIZE];
int length;
}Sqlist;


为了实现线性表最大存储结构元素数科随意变化,可以使用一个动态的数组来取代上面的固定长度数组,
如下描述:
线性表的动态分配随机存储结构:


#define LIST_INIT_SIZE 100 //初始分配量
#define LISTINCREMENT 10 //分配增量
typedef struct{
ElemType *elem; //存储空间基址;
int length; //当前长度;
int listsize; //当前分配的存储容量;
}Sqlist; //俗称顺序表


线性表操作:
InitList(&L);的实现:
构造一个空表,这是对表的一个加工型操作;因此,将L设为引用型的运算
首先动态分配存储空间,然后,将length置为0,表示表中没有数据元素。
InitList(&L){
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)//存储分配失败
exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;//初始存储容量
return OK;
}


LocateElem(SqList L, ElemType x);的实现:
按值查找元素:
int LocateElem(SqList L, ElemType x){
i = 0;
while(i <= L.length - 1 && L.length[i] != x)
i++;
if(i > L.length - 1)//没找到该元素
return ERROR;
else 
return i;//返回存储位置
}
时间性能:O(n)


ListInsert(&L, i, e);的实现:
Status ListInsert_Sq(SqList &L, int i, ElemType e){
//在顺序表L的第i个元素之前插入新的元素e
//i的合法范围为 1 <= i <= L.length + 1
q = &(L.elem[i - 1]); //q指示插入位置
for(p = &(L.elem[L.length - 1]); p >= q; --p)
*(p + 1) = *p; //插入位置及之后的元素右移
*q = e;                //插入e
++L.length;            //表长增加1
return OK;

if(i < 1 || i >L.length + 1)
return ERROR;
if(L.length >= L.listsize)
return OVERFLOW;
}
时间复杂度:O(n)


ListDelete(&L, i, &e)的实现:
Status ListDelete_Sq(SqList &L, int i, ElemType &e){
p = &(L.elem[i - 1]);//p为被删除元素的位置
e = *p;
for(q = &(L.elem[L.length - 1]); p < q; p++)
*p = *(p + 1);
--L.length;
return OK;

if(i < 1 || i >L.length + 1)
return ERROR;
if(L.length >= L.listsize)
return OVERFLOW;
}
时间复杂度:O(n)

猜你喜欢

转载自blog.csdn.net/l158943041/article/details/80545145