顺序表的定义

静态顺序表,通过静态数组实现

#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

标签: 顺序表, 数据结构

添加新评论