【数据结构】顺序表

顺序表

顺序表的存储结构分为静态分配和动态分配两种分配的存储结构,其中静态分配的数组大小固定,而动态分配的数组大小可变。

1.一维数组的静态、动态分配

静态分配存储结构
//一维数组的静态分配 
#define MaxSize 50
typedef struct {
	ElemType data[MaxSize];
	int length;
}SqList;

其中MaxSize为数组的固定大小,后续将不可更改。

动态分配存储结构
//一维数组的动态分配 
#define InitSize 100
typedef struct {
	ElemType *data;
	int length, MaxSize;
}SqList;
//给L顺序表动态分配内存,使用malloc函数
SqList L;
L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
//给顺序表追加空间,使用relloc函数
SqList LL;
LL.data = (ElemType)relloc(L.data, sizeof(ElemType)*InitSize*2);
LL.MaxSize = L.Max

其中使用data指针指向使用malloc函数分配的顺序表的起始元素,从而达到动态调节顺序表大小的效果。

2.顺序表的插入操作

bool ListInsert(SqList &L, int i, ElemType e) {
	/*将元素e插入表中*/
	//1.判断插入位置是否合法 
	if(i<1 || i>L.length+1)
		return false
	//2.判断数组是否已满
	if(L.length == MaxSize)
		return false;
	//3.插入(移动元素)
	for (int j=L.length-1; j>=i; j--){
		L.data[j+1] = L.data[j];
	} 
	//4.插入(插入元素)
	L.data[i-1] = e; 
	L.length++;
	return true;
}

当插入元素时:
1.最少移动次数是0次;
2.最多移动次数是n次;
3.平均移动次数是 ∑ i = 1 n p i ( n − i + 1 ) = n / 2 \sum_{i=1}^n p_i(n-i+1)=n/2 i=1npi(ni+1)=n/2
其中 p i p_i pi为插入i处的概率,为1/(n+1)

3.顺序表的删除操作

bool ListDelete(SqList &L, int i, ElemType &e){
	/*删除指定位置的元素,并通过e返回*/
	//1.判断删除位置是否有效 
	if(i > L.length)
		return false;
	//2.删除元素(赋值e) 
	e = L.data[i-1];
	//3.删除元素(移动) 
	for (int j=i-1; j<L.length; j++){
		L.data[j] = L.data[j+1];
	} 
	L.length--;
	return true;
}

当删除元素时:
1.最少移动次数是0次;
2.最多移动次数是n次;
3.平均移动次数是 ∑ i = 1 n p i ( n − i ) = ( n − 1 ) / 2 \sum_{i=1}^n p_i(n-i)=(n-1)/2 i=1npi(ni)=(n1)/2
其中 p i p_i pi为删除i处元素的概率,为1/n

4.顺序表的查找操作

int locateElem(SqList &L, ElemType e) {
	/*查找元素e*/
	//1.如果查找成功,返回元素位置 ;
	for (int i=0; i<L.length; i++){
		if (L.data[i] == e)
			return i+1; 
	} 
	//2.如果查找失败,返回0;
	return 0; 
}

当查找元素时:
1.最少比对次数是0次;
2.最多比对次数是n次;
3.平均比对次数是 ∑ i = 1 n p i ∗ i = ( n + 1 ) / 2 \sum_{i=1}^n p_i*i=(n+1)/2 i=1npii=(n+1)/2
其中 p i p_i pi为与i处元素比对的概率,为1/n

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瘦瘦无感

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值