2021-02-09

C++语言实现顺序表

顺序表优缺点
顺序表的优点:

  • 表中元素在存储地址上具有连续性,可直接通过下标快速获得任意元素地址,实现快速随机访问。
  • 在顺序表尾部插入或删除元素很快。

顺序表的缺点:

  • 对顺序表尾部以外位置执行插入或删除元素操作需要移动操作位置后面的全部元素,速度较慢。
  • 顺序表长度固定,不能灵活伸缩。

使用顺序表的常见错误
在遍历顺序表中的元素时,若中途有擦除或插入元素的操作,注意元素下标的指向会改变。

算法实现
头文件:

#ifndef SQLIST_H
#define SQLIST_H

#include"Star.h"
#define ELEMENT_TYPE Star
#define ARR_SIZE 100

typedef struct {
	ELEMENT_TYPE* eleArr;  //基地址
	unsigned length;  //长度
	unsigned size;  //容量
}SqList;
//初始化顺序表:
bool initList(SqList& sqL, const unsigned& size);
//销毁顺序表:
bool destroyList(SqList& sqL);
//向顺序表尾部追加元素[时间复杂度为o(1)]:
bool push_back(SqList& sqL, const ELEMENT_TYPE& ele);
//擦除顺序表尾部元素(声明为内联函数)[时间复杂度为o(1)]:
inline bool pop_back(SqList& sqL)
{
	if (sqL.length == 0) return false;
	--sqL.length;
	return true;
}
//向指定位置插入元素[时间复杂度为o(n)]:
bool insert(SqList& sqL, const unsigned& pos, const ELEMENT_TYPE& ele);
//擦除指定位置的元素[时间复杂度为o(n)]:
bool erase(SqList& sqL, const unsigned& pos);


#endif // !SQLIST_H

CPP文件:

#include "SqList.h"

bool initList(SqList& sqL, const unsigned& size)
{
	sqL.eleArr = new ELEMENT_TYPE[size];
	if (!sqL.eleArr) return false;  //若内存分配出错(堆溢出)
	sqL.length = 0;
	sqL.size = size;
	return true;
}

bool destroyList(SqList& sqL)
{
	if (!sqL.eleArr) return false;
	delete[] sqL.eleArr;
	sqL.eleArr = nullptr;
	sqL.length = 0;
	sqL.size = 0;
	return true;
}

bool push_back(SqList& sqL, const ELEMENT_TYPE& ele)
{
	if (sqL.length == sqL.size) return false;
	sqL.eleArr[sqL.length] = ele;
	++sqL.length;
	return true;
}

bool insert(SqList& sqL, const unsigned& pos, const ELEMENT_TYPE& ele)
{
	if (pos<0 || pos>sqL.length || sqL.length == sqL.size) return false;
	++sqL.length;
	for (auto i = sqL.length; i > pos; --i) {
		sqL.eleArr[i] = sqL.eleArr[i - 1];
	}
	sqL.eleArr[pos] = ele;
	return true;
}

bool erase(SqList& sqL, const unsigned& pos)
{
	if (pos >= sqL.length || pos < 0) return false;
	for (auto i = pos; i != sqL.length - 1; ++i) {
		sqL.eleArr[i] = sqL.eleArr[i + 1];
	}
	--sqL.length;
	return true;
}

``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

weixin_48343353

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

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

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

打赏作者

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

抵扣说明:

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

余额充值