数据结构|线性表的顺序存储

目录

1.地址的计算

2.元素特点

3.顺序存储的表示

4.基本运算

4.1线性表的初始化

4.2销毁线性表

4.3清空线性表

4.4求线性表的长度

4.5判断线性表是否为空

4.6顺序表的取值(根据位置i获取相应位置数据元素的内容) 

4.7顺序表的查找(按值查找)

4.8插入元素

4.9删除元素

4.10有序表的合并

5.优缺点


1.地址的计算

    假设线性表中n个元素,每个元素占k个单元,第i个元素地址为Loc(a{_{i}})。

Loc(a_{i})=Loc(a{_{1}})+(i-1)*k

2.元素特点

1.地址连续

2.依次存放

3.随机存取

4.类型相同

3.顺序存储的表示

#define MAXSIZE 100
typedef char ElemType; 
  
typedef struct{ 
	ElemType *elem;
	int length;
}SqList;

4.基本运算

4.1线性表的初始化

void InitList_Sq(SqList &L){ //构造一个空的顺序表
	L.elem=new ElemType[MAXSIZE];
	L.length=0;
}

4.2销毁线性表

void DestroyList(SqList &L) {
if(L.elem)
delete [] L.elem;
}

4.3清空线性表

void ClearList(SqList &L){
 	L.length=0;
 } 

4.4求线性表的长度

int GetLength(SqList L){
	return (L.length);
} 

4.5判断线性表是否为空

bool IsEmpty(SqList L){
	if(L.length==0)
	return true;
	else
	return false;
} 

4.6顺序表的取值(根据位置i获取相应位置数据元素的内容) ,随机存取 

ElemType GetElem(SqList L,int i,ElemType &e){
	if(!(i<1||i>L.length))
	e=L.elem[i-1];
	return e;
} 

4.7顺序表的查找(按值查找)

int LocateElem(SqList L,ElemType e){//在表中查找元素e 
	for(int i=0;i<L.length;i++)
	if(L.elem[i]==e)
	return i+1;
} 

4.8插入元素

#define OK 1
#define ERROR 0
int ListInsert(SqList &L,int i,ElemType e){ //在表中第i个位置插入元素e 
     if((i<1)||(i>L.length+1)) //i值不合法 
     return ERROR;
     if(i>MAXSIZE)        //当前存储空间已满 
     return ERROR;
     for(int j=L.length-1;j>=i-1;j--)
        L.elem[j+1]=L.elem[j];  //插入位置及之后的元素后移 
     L.elem[i-1]=e;
     L.length++;  //表长加一 
     return OK;
} 

算法分析:E为长度为n的表中插入一元素所需移动元素的平均次数,原有n个元素,则新插入元素可插入的位置有n+1个,假设在任何位置上插入的概率p{_{i}}相等,即p{_{i}}=\frac{1}{n+1} 

       插入位置        原有元素需移动的次数
n+10
n1
......
1n

E=\sum_{i=1}^{n+1}p{_{i}}(n-i+1)=\frac{1}{n+1}*(0+1+...n)=\frac{1}{n+1}*\frac{n(n+1)}{2}=\frac{n}{2}

所以,T(n)=O(n)

4.9删除元素

void ListDelete(SqList &L,int i) {
    if((i<1)||(i>L.length))
        cout<<"删除位置不合法"<<endl;
    else
	for(int j=i;j<=L.length-1;j++)	
	    L.elem[j-1]=L.elem[j];
	L.length--;
}

算法分析:E为删除一元素所需移动元素的平均次数,可删元素有n个,Q_{i}为删除第i个元素的概率,并假设在任何位置上删除的概率相等,即Q{_{i}}=\frac{1}{n}

删除位置原有元素需移动的次数
n0
n-11
......
1n-1

E=\sum_{i=1}^{n}Q{_{i}}(n-i)=\frac{1}{n}*(0+1+...n-1)=\frac{1}{n}*\frac{n(n-1)}{2}=\frac{n-1}{2}

所以,T(n)=O(n)

4.10有序表的合并

void MergeList(SqList La,SqList Lb,SqList &Lc){
	ElemType *pa,*pb,*pc,*pa_last,*pb_last;
	pa=La.elem;
	pb=Lb.elem; //指针pa,pb的初值分别指向两个表的第一个元素 
	Lc.length=La.length+Lb.length;
	Lc.elem=new ElemType[Lc.length] ;//为新表分配一个数组空间 
	pc=Lc.elem;
	pa_last=pa+La.length-1;//指向la表的最后一个元素 
	pb_last=pb+Lb.length-1;
	while (pa<=pa_last&&pb<=pb_last)
	    if(*pa<=*pb)
	       *pc++=*pa++;
	    else
	       *pc++=*pb++;
	while(pa<=pa_last)//LB表已到达表尾,将LA中剩余元素加入LC 
	    *pc++=*pa++;
	while(pb<=pb_last)//LA表已到达表尾,将LB中剩余元素加入LC 
	    *pc++=*pb++;
} 

5.优缺点

优点:  1.存储密度大,无须为表示结点间的逻辑关系而增加额外的存储空间(存储密度=结点本身所占存储量/结点结构所占存储量)

           2.可随机存取表中任一元素。

缺点:1.在插入、删除某一元素时,需移动大量的元素。

           2.可能造成存储空间的浪费。(预先分配的表空间较大)

           3.属于静态存储形式,数据元素的个数不能自由扩充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值