【一篇文章搞懂顺序表代码】数据结构(C++)

顺序表的定义以及基础操作

  1. 顺序表的定义:顺序表分为静态和动态两种类型。静态顺序表的长度是固定的,而动态顺序表的长度可以变化,以适应不同的存储需求。

  2. 顺序表的初始化:介绍了如何初始化静态和动态顺序表。静态顺序表的初始化较为简单,而动态顺序表需要动态分配内存。

  3. 顺序表的长度增加:对于动态顺序表,提供了一个方法来增加其长度,以适应更多的数据存储需求。

  4. 顺序表的插入操作:详细描述了如何在静态顺序表中插入新元素,包括对插入位置的合法性检查和元素的移动。

  5. 顺序表的删除操作:解释了如何从顺序表中删除指定位置的元素,并处理了元素的移动和内存释放。

  6. 顺序表的查找操作:介绍了两种查找方式:按位置查找和按值查找,展示了如何在顺序表中快速定位元素。

(1)顺序表的定义

        ①静态(长度不可变)

#define MAXSIZE 100 // 定义最大长度
typedef struct
{
    int data[MAXSIZE];
    int length;
} SqList;

        ②动态(长度可变)

#define InitSize 100
typedef struct
{
    int *data;
    int MaxSize;
    int length;
} SepList;

(2)顺序表的初始化

        ①静态

// 初始化一个顺序表(静态)
void InitSqList(SqList &L) {
    //不必要的默认值
    // for(int i=0;i<=L.length;i++){
    //     L.data[i]=0;
    // }
    L.length = 0;
}

        ②动态

// 初始化一个顺序表(动态)
void InitSepList(SepList &L) {
    L.data = (int *)malloc(InitSize * sizeof(int));
    if (L.data == NULL) {
        cout << "内存分配失败" << endl;
        exit(1);
    }
    L.length = 0;
    L.MaxSize = InitSize;
}

        动态可以增加表长:

// 写一个方法增加顺序表的长度
void IncreaseSize(SepList &L, int len) {
    int *p = L.data; // 创建一个p指针指向顺序表
    L.data = (int *)malloc((L.MaxSize + len) * sizeof(int));
    if (L.data == NULL) {
        cout << "内存分配失败" << endl;
        free(p);
        exit(1);
    }
    // 复制原来的数据到新的区域
    for (int i = 0; i < L.MaxSize; i++) {
        L.data[i] = p[i];
    }
    free(p);
    L.MaxSize += len;
}

(3)顺序表的插入

// 顺序表的插入(用的静态)
bool SqList_Insert(SqList &L, int i, int e) {
    // 把e插入到第i个位置上
    // 为了算法的健壮性,添加异常处理,判断i是否合法
    if (i < 1 || i > L.length + 1) {
        cout << "插入位置不合法,超出表的索引" << endl;
        return false;
    }
    if (L.length >= MAXSIZE) {
        cout << "表已经满啦~" << endl;
        return false;
    }
    for (int j = L.length; j >= i; j--) {
        // i之后的元素后移
        L.data[j] = L.data[j - 1];
    }
    L.data[i - 1] = e; // 把新的元素e插到的第i个位置
    L.length++;
    return true;
}

(4)顺序表的删除

// 顺序表的删除(用的静态)
bool SqList_Delete(SqList &L, int i, int &e) {
    if (i < 1 || i > L.length) {
        cout << "删除位置不合法,超出表的索引" << endl;
        return false;
    }
    e = L.data[i - 1]; // 获取被删除元素的值
    for (int j = i; j < L.length; j++) {
        // i之后的元素前移
        L.data[j - 1] = L.data[j];
    }
    cout << "删除了元素:" << e << endl;
    L.length--;
    return true;
}

(5)顺序表的查找

        ①按照位置查找

    //按位查找
bool SqList_GetByKey(SqList &L,int i, int &value){
    if (i < 1 || i > L.length) {
        cout << "查找位置不合法,超出表的索引" << endl;
        return false;
    }
    else{
        value=L.data[i-1];
        cout << "位置:"<<i<<" 查找成功! 值为:"<< value << endl;
        return true;
    }

}

        ②按照值查找

//按值查找
bool SqList_GetByvalue(SqList &L,int value,int &key){
    for(int i = 0; i<=L.length; i++){
        if(L.data[i]==value){
            key=i+1;
            cout<<"查找值:"<<value<<" 成功,地址为:"<<key<<endl;
            return true;
        }
    }
    cout<<"查找值:"<<value<<" 失败。查无此值"<<endl;
    return false;
}

(6)全部完整代码(可以直接运行)

#include <iostream>
using namespace std;

#define MAXSIZE 100 // 定义最大长度
typedef struct
{
    int data[MAXSIZE];
    int length;
} SqList;

// 初始化一个顺序表(静态)
void InitSqList(SqList &L) {
    //不必要的默认值
    // for(int i=0;i<=L.length;i++){
    //     L.data[i]=0;
    // }
    L.length = 0;
}

#define InitSize 100
typedef struct
{
    int *data;
    int MaxSize;
    int length;
} SepList;

// 初始化一个顺序表(动态)
void InitSepList(SepList &L) {
    L.data = (int *)malloc(InitSize * sizeof(int));
    if (L.data == NULL) {
        cout << "内存分配失败" << endl;
        exit(1);
    }
    L.length = 0;
    L.MaxSize = InitSize;
}

// 写一个方法增加顺序表的长度
void IncreaseSize(SepList &L, int len) {
    int *p = L.data; // 创建一个p指针指向顺序表
    L.data = (int *)malloc((L.MaxSize + len) * sizeof(int));
    if (L.data == NULL) {
        cout << "内存分配失败" << endl;
        free(p);
        exit(1);
    }
    // 复制原来的数据到新的区域
    for (int i = 0; i < L.MaxSize; i++) {
        L.data[i] = p[i];
    }
    free(p);
    L.MaxSize += len;
}

// 顺序表的插入(用的静态)
bool SqList_Insert(SqList &L, int i, int e) {
    // 把e插入到第i个位置上
    // 为了算法的健壮性,添加异常处理,判断i是否合法
    if (i < 1 || i > L.length + 1) {
        cout << "插入位置不合法,超出表的索引" << endl;
        return false;
    }
    if (L.length >= MAXSIZE) {
        cout << "表已经满啦~" << endl;
        return false;
    }
    for (int j = L.length; j >= i; j--) {
        // i之后的元素后移
        L.data[j] = L.data[j - 1];
    }
    L.data[i - 1] = e; // 把新的元素e插到的第i个位置
    L.length++;
    return true;
}

// 顺序表的删除(用的静态)
bool SqList_Delete(SqList &L, int i, int &e) {
    if (i < 1 || i > L.length) {
        cout << "删除位置不合法,超出表的索引" << endl;
        return false;
    }
    e = L.data[i - 1]; // 获取被删除元素的值
    for (int j = i; j < L.length; j++) {
        // i之后的元素前移
        L.data[j - 1] = L.data[j];
    }
    cout << "删除了元素:" << e << endl;
    L.length--;
    return true;
}
//顺序表的查找:

    //按位查找
bool SqList_GetByKey(SqList &L,int i, int &value){
    if (i < 1 || i > L.length) {
        cout << "查找位置不合法,超出表的索引" << endl;
        return false;
    }
    else{
        value=L.data[i-1];
        cout << "位置:"<<i<<" 查找成功! 值为:"<< value << endl;
        return true;
    }

}
    //按值查找
bool SqList_GetByvalue(SqList &L,int value,int &key){
    for(int i = 0; i<=L.length; i++){
        if(L.data[i]==value){
            key=i+1;
            cout<<"查找值:"<<value<<" 成功,地址为:"<<key<<endl;
            return true;
        }
    }
    cout<<"查找值:"<<value<<" 失败。查无此值"<<endl;
    return false;
}


int main() {
    SqList La;
    InitSqList(La);
    cout << "初始化后La的长度:" << La.length << endl;

    if (SqList_Insert(La, 1, 3)) { // 在第1个位置插入元素3
        cout << "太好了,插入成功了!" << endl;
    } else {
        cout << "可恶啊,插入失败了!" << endl;
    }

    cout << "插入一个元素后La的长度:" << La.length << endl;

    int e;
    if (SqList_Delete(La, 1, e)) { // 删除第1个位置的元素
        cout << "删除成功!" << endl;
    } else {
        cout << "删除失败!" << endl;
    }
    cout << "删除后La的长度:" << La.length << endl;
    SqList_Insert(La, 1, 3);//插入一个数据
    SqList_GetByKey(La,1,e);
    SqList_GetByvalue(La,4,e);
    return 0;
    
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值