第二章 线性表-顺序表
顺序表SqList
//顺序表SqList
#include <iostream>
#define MaxSize 10 // 定义顺序表的最大容量(静态分配大小)
// 顺序表存储结构
typedef struct{
int data[MaxSize]; // 使用静态数组存储数据元素
int length; // 顺序表的当前长度(有效元素个数)
}SqList; // 顺序表的类型定义
// 初始化顺序表
void InitList(SqList &L){
L.length = 0; // 顺序表初始长度为0(没有有效元素)
// 注意:静态数组不需要初始化内容,通过length控制访问范围
}
// 在顺序表L的第i个位置插入新元素e
bool ListInsert(SqList &L, int i, int e){
// 有效性检查:插入位置i必须在1到length+1之间
if(i < 1 || i > L.length + 1) // 当i > length+1时插入位置不连续
return false;
// 检查存储空间:顺序表已满则无法插入
if(L.length >= MaxSize)
return false;
// 元素后移操作:从最后一个元素开始向后移动
// 注意:从后向前移动避免覆盖未移动的数据
for(int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1]; // 将每个元素向后移动一位
}
L.data[i - 1] = e; // 在位置i处放入新元素e(数组下标从0开始)
L.length++; // 长度加1(增加一个有效元素)
return true; // 插入成功
}
// 删除顺序表L的第i个位置的元素
bool ListDelete(SqList &L, int i, int &e){
// 有效性检查:删除位置i必须在1到length之间
if(i < 1 || i > L.length)
return false;
e = L.data[i - 1]; // 保存被删除的元素值(通过引用参数返回)
// 元素前移操作:从删除位置开始向前覆盖
// 注意:j从i开始,将后面的元素依次前移
for(int j = i; j < L.length; j++) {
L.data[j - 1] = L.data[j]; // 将后续元素向前移动一位
}
L.length--; // 长度减1(减少一个有效元素)
return true; // 删除成功
}
// 按位查找:获取第i个位置的元素的值
int GetElem(SqList L, int i){
// 注意:这里假设调用者确保1 ≤ i ≤ length
// 实际应用中应添加边界检查:if(i<1||i>L.length) return -1;
return L.data[i - 1]; // 直接返回数组元素(位置i对应下标i-1)
}
// 按值查找:获取第一个元素值等于e的元素的位序
int LocateElem(SqList L, int e){
// 遍历顺序表查找目标元素
for(int i = 0; i < L.length; i++) {
if(L.data[i] == e)
return i + 1; // 返回位序(位置从1开始计数)
}
return 0; // 未找到返回0(表示查找失败)
}