【数据结构严蔚敏|课本笔记】2.2线性表的顺序表示和实现

算法2.2
上述两个算法的时间复杂度取决千抽象数据类型 List 定义中基本操作的执行时间。 假如 GetElem 和 Listlnsert 这两个操作的执行时间和表长无关, LocateElem 的执行时间 和表长成正比,则算法 2. 1 的时间复杂度为 0 (ListLength(LA) X ListLength (LB) ),算 法 2.2 的时间复杂度则为 0(ListLength(LA)+ ListLength(LB) )。虽然算法 2.2 中含 3 个 (while) 循环语句 , 但只有当 i 和 j 均指向表中实际存在的数据元素时,才能取得数据元 素的值并进行相互比较;并且当其中一个线性表的数据元素均已插入到线性表 LC 中后, 只要将另外一个线性表中的剩余元素依次插入即可。因此,对于每一组具体的输入 (LA 和 LB) ,后两个 (while) 循环语句只执行一个循环体。

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)+(i1)×l
式中LOC(a1)式线性表的第一个数据元素a1的存储位置,通常称做线性表的起始位置或基地址

顺序表特点:随机存取
数组类型也有随机存取的特性,所以通常使用数组来描述数据结构中顺序存储结构。因为线性表长度可变吗,所以需要使用动态分配的一维数组

//-----线性表的动态分配顺序存储结构------
#define LIST_INTIT_SIZE  100 //线性表存储空间的初始分配量
#define LISTINCRMENT  10//线性表存储空间分分配增量
typedef struct{
	ElemType *elem;   //存储空间地址
	int length; //当前长度
	int Listsize;  //当前分配的存储容量(以sizeof(ElemType)为单位)  
}SqList;

算法 2.3
//向线性表中插入一个数据元素,插入位置之后的元素依次先后移动一个位置
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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值