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;
}
``