数据结构与算法学习笔记一---顺序表的静态存储表示和实现(C++)

目录

前言

1.什么是顺序表

2.顺序表的静态存储表示

1.初始化

2.长度

3.数据元素

4.长度

5.获取元素下标

6.前驱节点

7.后继节点

8.插入

9.删除

10.遍历

11.测试代码


前言

    这篇文章讲的是顺序表的两种实现方式。

1.什么是顺序表

        线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。

        顺序表有以下性质:

图1.线性表中数据元素之间的关系

图2.线性表的顺序存储结构示意图

2.顺序表的静态存储表示

        我们使用数组来实现顺序表的静态表示,数组中的数据元素在存储中是连续的,但是使用数组表示顺序表有个缺点就是数组的长度不可变。

        顺序表的静态表示定义如下:

#define MAX_SIZE 10           //定数顺序表的最大表长
typedef int ElementType;
typedef int Status;
typedef struct StaticSqList {
    ElementType data[MAX_SIZE]; // 数据元素存储区
    int length; // 当前长度
}StaticSqList;

1.初始化

        初始化的时候,表长为空

// 初始化
void initStaticSqList(StaticSqList * sqList){
    sqList->length = 0;
}

2.长度

        返回静态顺序表的长度

// 长度
int staticSqListLength(StaticSqList *sqList){
    return sqList->length;
}

3.数据元素

        遍历数组

// 获取元素
Status getElemForStaticSqList(StaticSqList *sqList,int location,ElementType * element){
    if (location < 0 || location > sqList->length - 1) {
        return 0;
    }
    *element = sqList->data[location];
    return 1;
}

4.长度

// 长度
int staticSqListLength(StaticSqList *sqList){
    return sqList->length;
}

5.获取元素下标

// 获取元素
Status getElemForStaticSqList(StaticSqList *sqList,int location,ElementType * element){
    if (location < 0 || location > sqList->length - 1) {
        return 0;
    }
    *element = sqList->data[location];
    return 1;
}

6.前驱节点

// 前驱节点
Status priorElemForStaticSqList(StaticSqList *sqList,ElementType currentElement,ElementType * priorElement){
    for (int i = 0 ; i< sqList->length; i++) {
        if (sqList->data[i] == currentElement) {
            if (i - 1 > 0) {
                * priorElement = sqList->data[i-1];
                return 1;
            }
        }
    }
    return 0;
}

7.后继节点

// 后继节点
Status nextElemForStaticSqList(StaticSqList *sqList,ElementType currentElement,ElementType * nextElement){
    for (int i = 0 ; i< sqList->length; i++) {
        if (sqList->data[i] == currentElement) {
            if (i <= MAX_SIZE - 1) {
                * nextElement = sqList->data[i+1];
                return 1;
            }
        }
    }
    return 0;
}

8.插入

// 插入
Status insertStaticSqList(StaticSqList *sqList,int pos,ElementType element){
    if (pos < 0 || pos > sqList->length+1 || sqList->length == MAX_SIZE) {
        return 0;
    }
    for (int i = sqList->length; i > pos -1; i --) {//插入位置之后的元素后移
        sqList[i] = sqList[i-1];
    }
    sqList->data[pos-1] = element;
    sqList->length++;
    return 1;
}

9.删除

// 测试函数
void testStaticSqList(){
    StaticSqList sqList;
    cout<<"顺序表初始化......"<<endl;
    initStaticSqList(&sqList);
    cout<<"顺序表判空和长度计算......"<<endl;
    if (emptyStaticSqList(&sqList)) {
        cout<<"顺序表为空,长度为"<<staticSqListLength(&sqList)<<endl;
    }
    cout<<"顺序表插入测试......"<<endl;
    for (int i = 1; i <=11 ; i++) {
        if (insertStaticSqList(&sqList, sqList.length + 1, i)) {
            cout<<"数据元素"<<i<<"插入成功"<<endl;
        }else{
            cout<<"数据元素"<<i<<"插入失败"<<endl;
        }
    }
    cout<<"插入之后的静态顺序表"<<endl;
    traverseStaticSqList(&sqList);
    cout<<"顺序表删除测试......"<<endl;
    ElementType element;
    if (deleteStaticSqList(&sqList, 10, &element)) {
        cout<<"数据元素"<<element<<"删除成功"<<endl;
    }
    cout<<"删除之后的静态顺序表"<<endl;
    traverseStaticSqList(&sqList);
    //后继节点测试
    ElementType nextElement;
    if (nextElemForStaticSqList(&sqList, 8, &nextElement)) {
        cout<<"数据元素8"<<"后继节点为:"<<nextElement<<endl;
    }else{
        cout<<"后继节点不存在"<<endl;
    }
    //后继节点测试
    ElementType priorElement;
    if (priorElemForStaticSqList(&sqList, 8, &priorElement)) {
        cout<<"数据元素8"<<"前驱节点为:"<<priorElement<<endl;
    }else{
        cout<<"前驱节点不存在"<<endl;
    }
    cout<<"顺序表数据元素下标测试......"<<endl;
    for (int i = -1; i <= 12; i++) {
        int location;
        if (locationElemForStaticSqList(&sqList, i, &location)) {
            cout<<"数据元素"<<i<<"下标为:"<<location<<endl;
        }else{
            cout<<"数据元素不存在"<<endl;
        }
    }
    
}
// 删除
Status deleteStaticSqList(StaticSqList *sqList,int pos,int * element){
    if (pos < 1 || pos > sqList->length|| sqList->length == 0) {
        return 0;
    }
    for (int i = pos - 1; i < sqList->length - 1; i ++) {//插入位置之后的元素后移
        sqList[i] = sqList[i+1];
    }
    * element = sqList->data[pos-1];
    sqList->length--;
    return 1;
}

10.遍历

// 遍历
void traverseStaticSqList(StaticSqList *sqList){
    for (int i = 0; i<sqList->length; i++) {
        cout<<sqList->data[i]<<"\t";
    }
    cout<<endl;
}

11.测试代码

// 测试函数
void testStaticSqList(){
    StaticSqList sqList;
    cout<<"顺序表初始化......"<<endl;
    initStaticSqList(&sqList);
    cout<<"顺序表判空和长度计算......"<<endl;
    if (emptyStaticSqList(&sqList)) {
        cout<<"顺序表为空,长度为"<<staticSqListLength(&sqList)<<endl;
    }
    cout<<"顺序表插入测试......"<<endl;
    for (int i = 1; i <=11 ; i++) {
        if (insertStaticSqList(&sqList, sqList.length + 1, i)) {
            cout<<"数据元素"<<i<<"插入成功"<<endl;
        }else{
            cout<<"数据元素"<<i<<"插入失败"<<endl;
        }
    }
    cout<<"插入之后的静态顺序表"<<endl;
    traverseStaticSqList(&sqList);
    cout<<"顺序表删除测试......"<<endl;
    ElementType element;
    if (deleteStaticSqList(&sqList, 10, &element)) {
        cout<<"数据元素"<<element<<"删除成功"<<endl;
    }
    cout<<"删除之后的静态顺序表"<<endl;
    traverseStaticSqList(&sqList);
    //后继节点测试
    ElementType nextElement;
    if (nextElemForStaticSqList(&sqList, 8, &nextElement)) {
        cout<<"数据元素8"<<"后继节点为:"<<nextElement<<endl;
    }else{
        cout<<"后继节点不存在"<<endl;
    }
    //后继节点测试
    ElementType priorElement;
    if (priorElemForStaticSqList(&sqList, 8, &priorElement)) {
        cout<<"数据元素8"<<"前驱节点为:"<<priorElement<<endl;
    }else{
        cout<<"前驱节点不存在"<<endl;
    }
    cout<<"顺序表数据元素下标测试......"<<endl;
    for (int i = -1; i <= 12; i++) {
        int location;
        if (locationElemForStaticSqList(&sqList, i, &location)) {
            cout<<"数据元素"<<i<<"下标为:"<<location<<endl;
        }else{
            cout<<"数据元素不存在"<<endl;
        }
    }
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/631812.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(论文笔记)TABDDPM:使用扩散模型对表格数据进行建模

了解diffusion model&#xff1a;什么是diffusion model? 它为什么好用&#xff1f; - 知乎 摘要 去噪扩散概率模型目前正成为许多重要数据模式生成建模的主要范式。扩散模型在计算机视觉社区中最为流行&#xff0c;最近也在其他领域引起了一些关注&#xff0c;包括语音、NLP…

LangChain搭建Agent | 使用initialize_agent

1.create_tool_calling_agent 构建agent&#xff0c;这个方法是过时了吗&#xff1f;官方文档也没更新&#xff0c;官方示例也运行错误 from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import ConfigurableField from langchain_core…

医院污水一体化处理设备有哪些

医院污水一体化处理设备通常包括以下几个主要组件&#xff1a; 预处理单元&#xff1a;用于去除污水中的固体悬浮物、颗粒物、油脂等&#xff0c;常见的预处理单元包括格栅、沉砂池、油水分离器等。生物处理单元&#xff1a;用于降解有机物质和去除氮、磷等营养物质。常见的生物…

基坑监测识别摄像机

基坑是建筑施工中的一个重要环节&#xff0c;它对整个建筑工程的安全和稳定性起着至关重要的作用。为了监测基坑的状态和确保施工的安全进行&#xff0c;基坑监测识别摄像机被广泛应用于建筑工程中。这种摄像机可以实时监测基坑施工的情况&#xff0c;识别可能存在的问题并提供…

如何在Spring启动的时候执行一些操作

如何在Spring启动的时候执行一些操作 在Spring启动的时候执行一些操作有多种方式。你可以通过实现ApplicationRunner或者CommandLineRunner接口&#xff0c;在Spring Boot应用程序启动后执行特定操作。另外&#xff0c;你也可以使用PostConstruct注解&#xff0c;在Spring Bea…

圆片/圆盘测厚设备 HW01-SG系列单点测厚仪

关键字:圆片测厚仪圆盘测厚仪, 圆形测厚仪, 单点测厚仪, 汽车工件测厚仪, 产品简介&#xff1a; 测厚仪采用上下两个对射的激光位移传感器测量圆盘状物体边缘的厚度。圆盘放置在由步进电机驱动的托盘上&#xff0c;点按测量按钮托盘旋转一周&#xff0c;可测量被测物整个圆周上…

立即注册 | 线上讲座:基于 NGINX 为现代应用构筑三大安全防线

原文作者&#xff1a;NGINX 原文链接&#xff1a;立即注册 | 线上讲座&#xff1a;基于 NGINX 为现代应用构筑三大安全防线 转载来源&#xff1a;NGINX 开源社区 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 基本信息 课程主题&#xff1a;基于 NGINX 为现代应用构…

大模型算法(零) - Transformer中的细节与实现

讲transformer的文章已经铺天盖地了&#xff0c;但是大部分都是从原理的角度出发的文章&#xff0c;原理与实现之间的这部分讲解的较少&#xff0c;想要了解实现细节&#xff0c;还是要去看代码才行。记录一下自己学习过程中遇见的细节问题和实现问题。 Transformer整体架构 图…

Android面试题之Kotlin的几种常见的类

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 初始化的顺序 主构造函数里声明的属性 类级别的属性赋值 init初始化块里的属性赋值和函数调用 次构造函数里的属性赋值和函数调用 延迟初始…

Chirpstack配合网关与lora设备通信

之前的章节讲过chirpstack的下载和安装部署&#xff0c;这节算是后续&#xff0c;利用chirpstack和lora设备做通信&#xff0c; 首先开启chirpstack&#xff0c;并登录&#xff0c;登录完成之后需要添加网关和设备&#xff0c;添加网关也就是Gatway&#xff0c;所以点开左侧的G…

搜索二维矩阵 - LeetCode 热题 64

大家好&#xff01;我是曾续缘&#x1f9e1; 今天是《LeetCode 热题 100》系列 发车第 64 天 二分查找第 2 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增…

激光切割机哪家可靠?

激光切割机哪家可靠&#xff1f;市面上的激光切割机牌子很多&#xff0c;具体什么牌子好&#xff0c;建议综合考虑一下企业成立时间、技术实力、设备工艺做工、售后服务&#xff0c;一般成立时间长&#xff0c;设备装配经验丰富&#xff0c;售后服务完善的企业&#xff0c;能够…

深度学习之卷积神经网络理论基础

深度学习之卷积神经网络理论基础 卷积层的操作&#xff08;Convolutional layer&#xff09; 在提出卷积层的概念之前首先引入图像识别的特点 图像识别的特点 特征具有局部性&#xff1a;老虎重要特征“王字”仅出现在头部区域特征可能出现在任何位置下采样图像&#xff0c…

银行业数据分析专家视角:业务场景中的深度解析与应用

一、引言 在数字化和大数据时代的浪潮下&#xff0c;银行业正经历着前所未有的变革。作为数据分析领域的资深专家&#xff0c;我深知数据分析在银行业务发展中的重要性和价值。本文将从银行业数据分析的角度出发&#xff0c;深入探讨相关业务场景下的数据分析应用&#xff0c;…

Linux 操作系统MySQL 数据库指令

1.MySQL 数据库 数据库是“按照数据结构来组织、 存储和管理数据的仓库”。 是一个长期存储在计算机内的、 有组织的、 可共享的、 统一管理的大量数据的集合。 它的存储空间很大&#xff0c; 可以存放百万条、 千万条、 上亿条数据。 但是数据库并不是随意地将数据进行…

[vue] nvm use时报错 exit status 1:一堆乱码,exit status 5

报错exit status 5&#xff1a;&#xfffd;ܾ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ʡ&#xfffd; 原因&#xff1a;因为当前命令提示符窗口是user权限&#xff0c; 解决&#xff1a;cmd使用管理员方式打开就可以 参考&#xff1a; vm use时报错 exit status 1…

24长三角A题思路+分析选题

需要资料的宝子们可以进企鹅获取 A题 问题1&#xff1a;西湖游船上掉落华为 mate 60 pro 手机 1. 手机掉落范围分析 物品特征&#xff1a;华为 mate 60 pro 手机的尺寸、重量、形状等特性。静水假设&#xff1a;西湖水面平静&#xff0c;不考虑水流影响。掉落位置&#xff…

Linux基础之进程的优先级

目录 一、进程优先级的概念 二、进程优先级的查看 三、怎么修改进程优先级 四、进程饥饿 一、进程优先级的概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linu…

从零入门激光SLAM(十七)——SLAM中为什么用ESKF误差卡尔曼滤波器

上一节&#xff0c;介绍了卡尔曼滤波的基本原理&#xff0c;但在SLAM中却使用ESKF&#xff0c;让我们一起看看具体的原因是什么吧 一、误差卡尔曼滤波器ESKF(Error State Kalman Filter) 1.1动机 在常规的卡尔曼滤波器中&#xff0c;需要假定系统的状态服从高斯分布&#xf…

语法分析-文法

如果对于一部文法中&#xff0c;存在至少一个句子有两个或者两个以上的语法树则该文法是二义性的。 我们可以以上面的例子进行解释&#xff0c;对于第棵个语法树&#xff0c;我们可以看到是先进行了加法运算再进行的乘法运算&#xff0c;因为需要先把EE作为整体运算完后再成为E…