静态顺序表的实现(插入 / 删除 / 查找)
顺序表的定义
静态顺序表,通过静态数组实现
#define MaxSize 50 // 定义顺序表的最大容量(最多能存储的元素个数),使用宏定义便于后续统一修改
typedef int ElemType; // 定义顺序表中存储元素的数据类型为int型,typedef重命名方便后续修改类型(如改为char、float等)
typedef struct {
ElemType data[MaxSize]; // 存储顺序表元素的数组,MaxSize限定了数组的最大长度
int length; // 记录顺序表中当前实际存储的元素个数
}SqList; // 别名
顺序表的插入
参数说明:
- L: 待操作的顺序表(使用引用&,直接修改原顺序表,无需返回)
- i: 要插入的位置(逻辑位序,从1开始计数,如i=1表示插入到第一个位置)
- 注意:使用int,而不是ElemType,插入位置 i 是一个 “位置序号”,和元素类型无关
- element: 要插入的具体元素值
bool ListInsert(SqList &L,int i,ElemType element){
// if(1<=i && i<=L.length+1){
// 也可以使用这种,不过嵌套很多
// }
// 1. 判断插入位置是否合法
// 合法范围:1 ≤ i ≤ 表长+1(插入到表尾时i=L.length+1)
if(i<1 || i>L.length+1){
return false;
}
// 2. 判断顺序表是否已满
// 表长等于最大容量时,无法再插入新元素
if(L.length==MaxSize){
return false;
}
// 3. 元素后移:从表尾开始到插入位置i,将元素依次向后移动一位
// 为插入位置腾出空间,避免覆盖数据(从后往前移可防止数据丢失)
// j:现在需要操作的元素,i:要插入的位置,所以>=,要把i的位置腾出来
for (int j=L.length; j>=i; --j) {
L.data[j]=L.data[j-1];
}
// 4. 将待插入元素放入腾出的位置
// 注意:逻辑位序i对应数组下标i-1
L.data[i-1]=element;
// 5. 更新顺序表的实际长度(插入成功,表长+1)
L.length++;
return true;
}
顺序表的删除
按位置删除顺序表中的元素
参数说明:
- L: 待操作的顺序表(引用&传递,直接修改原顺序表)
- i: 要删除元素的逻辑位置(从1开始计数,如i=2表示删除第2个元素)
- 注意:使用int,而不是ElemType,插入位置 i 是一个 “位置序号”,和元素类型无关
- e: 输出型参数(引用&传递),用于保存被删除的元素值
bool ListDelete(SqList &L,int i,ElemType &e){
// 1. 判断删除位置是否合法
// 合法范围:1 ≤ i ≤ 表长
if(i<1 || i>L.length){
return false;
}
// 2. 保存要删除的元素
e=L.data[i-1];
// 3.元素移动
// 循环变量j:起始为删除位置的数组下标(i-1),终止为表长-2(避免下标越界)
for (int j=i-1; j<L.length-1; ++j) {
L.data[j]=L.data[j+1];
}
// 4.更新顺序表的实际长度(删除成功,表长-1)
L.length--;
return true;
}
顺序表的查询
顺序表按值查询元素位置(查找第一个匹配的元素)
参数说明:
- L: 待查询的顺序表(值传递,仅读取数据不修改原表)
- element: 要查找的目标元素值
- 返回值:int类型,找到则返回元素的逻辑位置(从1开始),未找到返回0
int LocateElem(SqList L,ElemType element){
// 遍历顺序表的所有有效元素(数组下标从0到L.length-1)
for (int i = 0; i < L.length; ++i) {
if(L.data[i]==element){
// 找到匹配元素,返回逻辑位置(下标+1)
return i+1;
}
}
return 0;
}
输出看看
//打印函数
void PrintList(SqList L){
for (int i = 0; i < L.length; ++i) {
printf("%3d",L.data[i]);
}
printf("\n");
}
int main() {
SqList L;
L.data[0]=1;
L.data[1]=2;
L.data[2]=3;
L.length=3;
bool ret;
ret=ListInsert(L,2,30);
if(ret){
printf("insert sqlist success\n");
PrintList(L);
} else{
printf("insert sqlist failed\n");
}
ElemType del;
ret=ListDelete(L,4,del);
if(ret){
printf("delete sqlist success\ndelete element:%d\n",del);
PrintList(L);
} else{
printf("delete sqlist failed\n");
}
int pos;
pos=LocateElem(L,30);
if(pos){
printf("find this element\nelement pos:%d\n",pos);
} else{
printf("don't find this element\n");
}
return 0;
}
输出结果
insert sqlist success
1 30 2 3
delete sqlist success
delete element:3
1 30 2
find this element
element pos:2