通过C++模板实现了数据结构中的顺序链表的功能,采用动态分配数组的方法来时间顺序线性表。
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
template <typename ElemType>
class SqList {
private:
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
public:
//无参构造函数,构造一个空的线性表
SqList() {
elem = new ElemType[LIST_INIT_SIZE]; //为线性表分配初始空间
length = 0; //当前线性表长度为0
listsize = LIST_INIT_SIZE; //容量为初始容量
}
//有参构造函数,参数为初始线性表的长度,构造一个空的线性表
SqList(int init_size) {
elem = new ElemType[init_size]; //为线性表分配初始空间
length = init_size; //线性表长度为用户指定长度init_size
listsize = init_size; //容量为用户指定容量
}
//有参构造函数,参数为初始线性表的长度,以及初始化某一个元素的值,构造一个空的线性表
SqList(int init_size, ElemType init_elem) {
elem = new ElemType[init_size]; //为线性表分配初始空间
length = init_size; //线性表长度为用户指定长度init_size
listsize = init_size; //容量为用户指定容量
for (int i = 0; i < length; i++)
elem[i] = init_elem; //初始化为用户指定的元素
}
//析构函数,用于释放线性表空间,销毁线性表
~SqList() {
length = 0; //使线性表长度为0
listsize = 0; //使线性表容量也为0
delete[]elem; //释放线性表空间
}
//将线性表置为空
void ClearList() {
for (int i = 0; i < length; i++)
elem[i] = NULL; //将线性表内的元素全部置为空
}
//判断线性表是否为空
bool ListEmpty() {
if (!elem) //若线性表基址为空,则认为是空表,也可以用(!length)来判断
return true;
else
return false;
}
//返回线性表中第i个数据元素的值
ElemType GetElem(int i) {
// 1<=i<=length
return elem[i - 1];
}
//获取线性表的长度
int LinkLength() {
return length;
}
//判断线性表中第一个与e相等的数据元素的位序,如果不存在返回-1
int LocateElem(ElemType e) {
int i = 0;
for (i = 0; i < length; i++) {
if (e == elem[i])
return i + 1;
}
if (i == length)
return -1;
}
// 在线性表中第i个位置之前插入新的数据元素e,线性表的长度加1,1<=i<=length
void ListInsert(int i, ElemType e) {
if (i < 1 || i > length + 1)
return; //i值不合法
if (length >= listsize) { //当前存储空间已满,增加分配
ElemType *newbase = new ElemType[listsize + LISTINCREMENT];
elem = newbase; //新基址
listsize += LISTINCREMENT; //增加存储容量
}
ElemType *q = &elem[i - 1]; //q为插入位置
for (ElemType *p = &elem[length - 1]; p >= q; --p)
*(p + 1) = *p; //插入位置及之后的元素右移
*q = e; //插入e
++length; //表长增1
}
// 在顺序线性表中删除第i个元素,i的合法值为1<=i<=length
void ListDelete(int i) {
if (i < 1 || i > length)
return; //i值不合法
ElemType *p = &elem[i - 1]; //p为被删除元素的位置
ElemType *q = &elem[length - 1]; //表尾元素的位置
for (++p; p <= q; ++p)
*(p - 1) = *p; //被删除元素之后的元素左移
--length; //表长减1
}
};