【详细注释】数据结构 顺序表的增删查 C/C++实现

前言

顺序表将数据存储在计算机内存中的相邻存储单元内,故结构体内部存储直接使用数组即可。

代码实现

/**
 * 请注意,由于本次实现需要用到bool变量以及引用,请创建
 * C++文件而不是C文件
 */

#include <iostream>

#define MAX_SIZE 50

/*int改名为ElemType的意义是,使用ElemType代表变量类型,
表示此算法对任意一个变量类型都适用*/
typedef int ElemType;

//typedef命名一个名字叫SqList的结构体
typedef struct{
    ElemType data[MAX_SIZE];    //定义一个最大为50的数组
    int length; //定义当前顺序表的长度(有多少个元素)
} SqList;


/**
 * 将某一元素插入顺序表
 * @param L 对当前顺序表的引用(C++知识)
 * @param i 插入的位置
 * @param e 插入的内容(当前为int类型)
 * @return 插入是否成功(bool变量)
 */
bool ListInsert(SqList &L, int i, ElemType e){
    //判断要插入的位置是否合法
    if(i<1 || i>L.length) {   //i小于1或者大于当前顺序表的长度,都是不对的,最小为1,最大为当前顺序表长度(数组比顺序表长度少1)
        printf("插入位置不合法\n");
        return false;
    }
    //判断是否超出空间了
    if(L.length+1 > MAX_SIZE){
        printf("超出空间\n");
        return false;
    }
    //插入操作
    /*
     * 使j等于当前顺序表长度,这时的j放入数组内正好是最后一个元素的下一个
     */
    for(int j = L.length; j>=i; j--){
        L.data[j] = L.data[j-1];
    }
    //在数组上第i-1的位置插入数据
    L.data[i-1] = e;
    //顺序表长度+1
    L.length++;
    return true;
}

/**
 * 将某一元素从顺序表中删除
 * @param L 对当前顺序表的引用
 * @param i 删除的位置
 * @param &e 对e进行取值
 * @return 删除是否成功(bool变量)
 */
bool ListDelete(SqList &L, int i, ElemType &e){
    //判断删除的位置是否合法
    if (i<1 || i>L.length){
        printf("删除位置不合法\n");
        return false;
    }
    //将要删除的值赋给e
    e = L.data[i-1];
    //将值删除
    for(int j=i; j<L.length; j++){
        L.data[j-1] = L.data[j];
    }
    //顺序表长度减一
    L.length--;
    return true;
}

/**
 * 查找某一元素在顺序表中的位置
 * @param L
 * @param e
 * @return
 */
int LocateElem(SqList L,ElemType e)
{
    int i;
    for(i=0;i<L.length;i++)
        if(L.data[i]==e)
            return i+1; //加1就是元素在顺序表中的位置
    return 0;
}

/**
 * 打印某一顺序表
 * @param L 顺序表
 */
void ListPrint(SqList L){
    //循环遍历
    for(int i=0; i<L.length; i++){
        printf("%d ", L.data[i]);
    }
    printf("\n");
}

int main() {
    int length = 0;
    SqList L;

    printf("输入顺序表长度:");
    scanf("%d", &length);
    L.length = length;

    for(int i=0; i<length; i++){
        printf("输入第%d个位置元素:", (i+1));
        scanf("%d", &L.data[i]);
    }

    //打印输出当前顺序表
    ListPrint(L);

    //定位值为30的顺序表内元素
    int testLocateElem = LocateElem(L, 30);
    if (testLocateElem)
        printf("此元素的位置是: %d\n", testLocateElem);
    else
        printf("定位失败,顺序表内没有此元素\n");

    //尝试删除第三位元素
    int ret1;
    bool testListDelete = ListDelete(L, 3, ret1);
    if(testListDelete)
        printf("被删除的元素是:%d\n", ret1);
    printf("当前顺序表为:\n");
    ListPrint(L);

    //尝试将30插入第三位
    bool testListInsert = ListInsert(L, 3, 30);
    if (testListInsert){
        printf("插入成功,当前顺序表为:\n");
        ListPrint(L);
    }

    return 0;
}

运行结果截图请添加图片描述

运行环境

macOS BigSur
CLion
(使用其他环境的同学注意环境配置)

心得

距离最一开始学习数据结构与算法已经过去一年多了,再一次踏上对数据结构的王道征途,心情难免有些忐忑和激动。文章与代码难免出错,麻烦您在评论区指出,我一定第一时间内改正。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值