什么是顺序表?
顺序表是一种简单的线性结构,他和我们之前使用的数组非常相似,在逻辑上相邻的数据在存储位置上也是相邻的,数据之间一个挨着一个,中间不允许有空值,可以在尾部添加元素,插入元素,删除元素.
顺序表有三个要素:
typename *elems; 用来表示记录存储位置的基地址,
int length; 表示存储的元素个数,
int size; 为顺序表分配的一段可连续存储的空间,
但是我们为什么要使用顺序表?在计算机的一些应用场合,当我们需要遍历大量的元素,但遍历完之后某些元素就不再需要的时候,我们可以使用它把当中的某些元素剔除掉,这样就可以减少对元素遍历的次数,提高效率.
那我们该怎么用顺序表呢?
首先我们构建一个顺序表结构体
typedef struct {
int* elems;//下标从0数起
int length;
int size;
}SqList;
它的常用的几个功能是:尾部添加元素,插入元素,删除元素
//1.尾部添加元素
bool listAppend(SqList& list, int e) {
if (list.length == list.size)return false;
list.elems[list.length] = e;
list.length++;
return true;
}
//2.插入元素
bool listInsert(SqList& list, int i, int e) {
if (i<0 || i>=list.length)return false;
if (list.length == list.size)return false;
for (int j = list.length - 1; j >= i; j--) {
list.elems[j + 1] = list.elems[j];
}
list.elems[i] = e;//将新元素插入
list.length++; //元素增加1
return true;
}
//3.删除元素
bool listDelete(SqList& list, int i) {
if (i < 0 || i >= list.length)return false;
//最后一个元素
if (i == list.length - 1) {
list.length--;
return true;
}
else {
for (int j = i; j < list.length - 1; j++) {
list.elems[j] = list.elems[j + 1];//在删除元素位置的后续元素依次往前移
}
list.length--;
return true;
}
}
需要注意的是,在往中间插入一个元素的时,该位置往后的连续元素都要相应的往后移动一个元素的位置,所以我们得先把最后面的元素往后移动一个元素位置,前面的元素再依次的往后移动;同样的,删除元素的时候,中间就出现了一个空的位置,此时后面的元素也要相应的往前移动.
最后,该顺序表的使用周期结束后,要记得销毁顺序表,使用delete释放初始化时分配的new的内存!
//4.销毁顺序表
void destoryList(SqList& list) {
if (list.elems) delete[] list.elems;
list.length = 0;
list.size = 0;
}
今天的分享就到这里了.