一、顺序表的定义及表示
1.顺序表
用一组连续的存储单元依次存放线性表中的所有元素,称该类型的线性表为顺序表
2.类型定义
const int N = 100;
//顺序表类型定义
typedef struct slNode {
int data[N];//顺序表,N为顺序表元素数量的上限
int len;//顺序表的实际长度
slNode() :len(0){ }//初始化
}seqList;
二、顺序表的基本操作
1.插入操作
1.算法1-1:在顺序表的指定位置插入一个元素
//在顺序表sl的位置p处插入一个元素,元素值为x
void sl_insert(seqList& sl, int p, int x) {
if (sl.len >= N) {
cout << "表满,插入失败" << endl;
return;
}
if (p >= sl.len)
sl.data[sl.len] = x;//若插入位置大于最后一个元素的下标,则将x插入表尾
else {
if (p < 0)p = 0;//位置为负数,插入表头
for (int i = sl.len; i >= p; i--) //将原表中位置p及其之后的元素向右移动一位
sl.data[i] = sl.data[i - 1];
sl.data[p] = x;
}
sl.len++;//顺序表的长度增加1
}
算法1-2:在顺序表的末尾插入元素
//将x添加到sl的末尾
void sl_pushBack(seqList& sl, int x) {
sl.data[sl.len] = x;
sl.len++;
}
2.查找操作
算法1-2:查找顺序表中的元素
功能
查找某个元素,返回位置
算法步骤
从位置p出发向后遍历顺序表,将每个元素与x比较, 如果某个元素的值为x,则返回该元素的下标;如果遍历到最后一个元素都没有发现值为x的元素,就返回最后一个元素的下一个位置
//查找顺序表sl中位置p开始的第一个值为x的元素,如果存在,则返回下标,否则返回sl.len
int sl_search(seqList sl, int p, int x) {
if (p >= sl.len)return sl.len;
int i;
for (i = max(0, p); i < sl.len; i++)
if (sl.data[i] == x)break;//sl中第一个值为x的元素的下标为i
return i;
}
3.删除操作
算法1-4:删除指定位置的元素
功能
删除指定位置的元素
算法步骤
从顺序表中指定位置删除一个元素,被删除的元素原先存储的位置就会空出来,为了保持顺序表物理位置与逻辑结构的对应关系,需要将删除位置后的元素依次前移以填补空位
//删除指定位置的元素
void sl_delete(seqList& sl, int p) {
if (p >= sl.len || p < 0 || sl.len == 0) {
cout << "删除失败" << endl;
return;
}
for (int i = p; i < sl.len; i++)//将原表位置o及其之后的元素向前移动一位
sl.data[i] = sl.data[i + 1];
sl.len--;
}