线性表的顺序存储结构(二)

本文深入探讨了线性表的顺序存储结构特性及其插入与删除操作的实现,强调了O(1)的存取效率,并分析了线性表顺序存储的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线性表的顺序存储结构

对于顺序存储结构的线性表我们这里直接称之为线性表,后面一系列关于数据结构的文章中都这样声明。(我们为了后面的方便,才这样声明的)

线性表中的元素类型都是一样的,假设线性表中的每个元素占用c个字节的存储单元。那么线性表中第i + 1个数据元素和第i个数据元素的存储地址的关系是addr(a(i + 1)) = addr(ai )  + c,其中addr表示求得相应位置的地址。则线性表中的第i个数据元素ai的存储地址依据下面的公式可以由a1推算得到
addr(ai) = addr(a1) + (i - 1)*c
通过这个公式,我们可以计算出线性表中任一元素的地址,这样每个元素的存储时间性能为o(1),我们通常称顺序存储结构的线性表为随机存储结构。

线性表顺序存储的结构代码:
#define MAXSIZE 100
typedef float ElemType
typedef struct
{
	ElemType data[MAXSIZE];
	int length;//线性表的当前长度
}Slist;

现在介绍下线性表的插入与删除,首先介绍如何在线性表的第i个位置插入新的元素y。

在线性表中插入元素的算法思路如下:
1)插入位置不合理或线性表长度等于数组长度,抛出异常。
2)从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置。
3)将要插入元素填入位置i处。
4)线性表长加1。

下面的代码是如何在线性表的第i个位置插入新的元素y
#define bingo 1
#define error 0

#define MAXSIZE 100
typedef float ElemType;
typedef struct
{
	ElemType data[MAXSIZE];
	int length;//线性表的当前长度
}Slist;

int ListInsert(Slist *L,int i,ElemType y)
{
	if(L->length==MAXSIZE)return error;

	if(i < 1 || i > L->length )return error;

	if(i <= L->length)
	{
		for(int j = L->length;j>=i;j--)
			 L->data[j] = L->data[j-1];
	}
	L->data[i - 1] = y;
	L->length++;

	return bingo;
}

void main()
{
	Slist student = {{1,2,3,4,5,6,7,8,8,9},10};//结构体的初始化
	Slist *L = &student;  
	 ListInsert(L,11,100);

	 for(int i = 1;i <= L->length;i++)
	 {
		cout<<L->data[i-1]<<endl;
	 }

}

在线性表中删除元素的算法思路如下:
1)删除位置不合理,抛出异常。
2)取出删除元素。
3)从删除元素后面第一个位置开始遍历到最后一个元素位置,分别将它们向前移动一个位置。
4)线性表长减1。
下面的代码是如何删除线性表的第i个位置的元素
#define bingo 1
#define error 0

#define MAXSIZE 100
typedef float ElemType;
typedef struct
{
	ElemType data[MAXSIZE];
	int length;//线性表的当前长度
}Slist;

int ListDelete(Slist *L,int i,ElemType &y)//删除线性表中第i个位置的元素
{
	
	if( L->length == 0 )return error;
	if(i < 1 || i > L->length )return error;

     y = L->data[i - 1];
	if(i < L->length)
	{
		for(int j = i + 1;j<= L->length;j++)
			 L->data[j - 2] = L->data[j-1];
	}

	L->length--;

	return bingo;
}

void main()
{
	Slist student = {{1,2,3,4,5,100,7,8,8,9},10};//结构体的初始化
	Slist *L = &student;  
	ElemType a ;
	 ListDelete(L,6,a);
	 cout<<"a="<<a<<endl;

	 for(int i = 1;i <= L->length;i++)
	 {
		cout<<L->data[i-1]<<endl;
	 }

}

线性表插入和删除的时间复杂度:线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是o(1)。而在插入或删除时,时间复杂度都是o(n)。

线性表的顺序存储结构的优缺点:
优点:1)无需为表示表中元素之间的逻辑关系而增加额外的存储空间。2)可以快速存取表中任意位置的元素。
缺点:1)插入和删除操作都需要移除大量的元素。2)当线性表长度变化较大时,难以确定存储空间的容量。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值