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

news2024/11/28 18:48:44

目录

前言

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;
        }
    }
    
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用hMailServer+roundcubemail+宝塔安装配置一个自己的邮箱服务

用hMailServerroundcubemail安装配置一个自己的邮箱服务 1、准备工具与资料&#xff1a; 云服务器一台 基础配置就行 2核4G。域名一个 以下用lizipro.cn示例。hMailServer安装包roundcubemail安装包异常处理插件补丁&#xff1a; libmysql.zip 2、hMailServer服务安装&#…

通过内网穿透免费部署我们的springboot+vue项目 实现跟服务器一样的效果

前文讲到通过内网穿透能够实现远程访问个人电脑的静态资源。本文将讲解通过内网穿透实现远程访问本地的项目&#xff0c;实现跟部署到服务器一样的效果&#xff1a;前文链接&#xff1a;通过内网穿透实现远程访问个人电脑资源详细过程&#xff08;免费&#xff09;&#xff08;…

MFC重要的初始化函数InitInstance

MFC应用程序最早处理的类的初始化函数通常是CWinApp类的构造函数。CWinApp类是MFC应用程序的主类&#xff0c;负责整个应用程序的初始化和管理。 在MFC应用程序中&#xff0c;通常会创建一个派生自CWinApp类的应用程序类&#xff0c;例如CMyApp。在应用程序启动时&#xff0c;…

MySQL——系统变量

使用 #最大连接用户数 select MAX_CONNECTIONS; #临时存放构成每次事务的SQL的缓冲区长度 select BINLOG_CACHE_SIZE; #SQL Server的版本信息 select VERSION; 查询结果

Linux实验 系统管理(三)

实验目的&#xff1a; 了解Linux系统下的进程&#xff1b;掌握一类守护进程——计划任务的管理&#xff1b;掌握进程管理的常用命令&#xff1b;掌握进程的前台与后台管理&#xff1b;了解Linux系统的运行级别&#xff1b;掌握系统服务管理的常用命令。 实验内容&#xff1a; …

可视化大屏:城市治理方向,三维地图那是相当震撼呀。

随着城市化进程的加快&#xff0c;城市治理变得越来越复杂&#xff0c;需要大量的数据和信息来支持决策和管理。在这个背景下&#xff0c;可视化大屏作为一种新兴的信息展示工具&#xff0c;正逐渐在城市治理中发挥着重要作用。 首先&#xff0c;可视化大屏能够将庞大的数据和信…

Web前端一套全部清晰 ⑧ day5 CSS.3 选择器、PxCook软件、盒子模型

谁不是一路荆棘而过呢 —— 24.5.12 CSS.3 选择器、PxCook软件、盒子模型 一、选择器 1.结构伪类选择器 1.作用: 根据元素的结构关系查找元素。 选择器 说明 E:first-child 查找第一个 E元素 E:last-child 查找最后一个E元素 E:nth-chil…

数据结构·一篇搞定栈!

好久不见&#xff0c;超级想念 废话不多说&#xff0c;直接看 引言 在数据结构的大家族中&#xff0c;栈&#xff08;Stack&#xff09;是一种非常重要的线性数据结构&#xff0c;它的特点是后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;。栈在程序设…

docker八大架构之单机架构

单机架构 什么是单机架构&#xff1f; 单机架构指的是应用服务和数据库服务公用同一台服务器。如下边两个图所示&#xff0c;当我们进行购物时&#xff0c;所有的物品信息和用户信息都是在同一个服务器下进行运行的&#xff0c;之所以称为单机架构就是因为它所有的操作是在同…

【AMBA Bus ACE 总线10 -- ACE Barrier transaction 详细介绍】

请阅读【AMBA Bus ACE 总线与Cache 专栏 】 欢迎学习:【嵌入式开发学习必备专栏】 文章目录 ACE AxBARAxBAR[1:0]的值及含义屏障的用途和重要性ACE AxBAR 用于表明是否是一个barrier 的transaction,对于它我们只需要有个简单的了解即可,现在已经不建议在transaction的层面上…

Unity VR在编辑器下开启Quest3透视(PassThrough)功能

现在有个需求是PC端串流在某些特定时候需要开启透视。我研究了两天发现一些坑,记录一下方便查阅,也给没踩坑的朋友一些思路方案。 先说结论,如果要打PC端或者在Unity编辑器中开启,那么OpenXR当前是不行的可能还需要一个长期的过程,必须需要切换到Oculus。当然Unity官方指…

异常处理/ROS2异常处理模块源码解读与浅析

文章目录 概述ros2/rcutils/src/error_handling模块自身异常处理错误状态结构与存储本模块初始化错误状态的设置错误状态的获取错误状态的清理不丢失旧错误状态把手段还原为目的其他 概述 本文从如下几个方面对 ROS2.0 中 rcutils 库 error_handling 错误处理模块的源码进行解…

整理好的中债国债3年期到期收益率数据集(2002-2023年)

01、数据简介 国债&#xff0c;又称国家公债&#xff0c;是由国家发行的债券&#xff0c;是中央ZF为筹集CZ资金而发行的一种ZF债券&#xff0c;是中央ZF向投资者出具的、承诺在一定时期支付利息和到期偿还本金的债权债务凭证。 中债&#xff0c;是指由中国中债登记结算有限责…

报表-接口类型的数据源

1、配置 在数据中进行如下配置 配置格式&#xff0c;换行的方式 #API $.data[0].children http://192.168.1.1:9200/apis/getInfo 行1&#xff1a;固定写法&#xff0c;标识这是一个接口类型的数据集 行2&#xff1a;JSONPath格式字符串&#xff0c;对接口的数据进行取值。…

轮转数组 与 消失的数字

轮转数组 思路一 创建一个新内存空间&#xff0c;将需轮转的数依次放入&#xff0c;之后在把其它数放入 代码&#xff1a; void rotate(int* nums, int numsSize, int k) {k k % numsSize;// 确定有效的旋转次数if(k 0)return;int* newnums (int*)malloc(sizeof(int) * nu…

Linux与Windows互传文件【笔记】

Linux与Windows互传文件【笔记】 前言前言推荐Linux与Windows互传文件首先确保Windows安装ssh如何传送文件问题 最后 前言 这是陈旧已久的草稿2023-05-10 00:01:24 这个是准备把计组课程华为智能计组的&#xff0c;传输文件。 最后发现&#xff0c;好像没有实现了。 现在202…

云器Lakehouse:Multi-Cluster弹性架构如何实现湖上高并发低延迟分析

导读 在当今快速发展的大数据时代&#xff0c;数据平台的性能和效率对于企业来说至关重要。云器Lakehouse的Multi-Cluster弹性架构为我们提供了一种全新的视角&#xff0c;以应对数据湖上高并发和低延迟分析的挑战。本文将深入探讨云器Lakehouse如何通过其独特的技术理念和架构…

MySql软件安装

1.打开mysql官网网址 MySQL :: Download MySQL Community Server 2.本次针对版本8的图形化界面安装&#xff0c;下载成功后接下来对MySQL进行安装 3.图形化下载后有一个MSI文件 4.我们安装典型即可&#xff0c;选择第一个 5.选择数据库信息存放的路径&#xff0c;我默认放在C盘…

知识库优劣详解:牵牛易帮 VS HelpLook AI知识库

知识库不仅可以帮助企业有效管理知识&#xff0c;还能提高员工工作效率和质量&#xff0c;因此越来越多的企业选择搭建知识库。在众多搭建知识库的工具中&#xff0c;有的企业会选择免费的牵牛易帮&#xff0c;有的则会更加倾向于付费的HelpLook AI知识库。其中的原因有很多。今…

U盘文件遇损?拯救“文件或目录损坏且无法读取”的秘籍!

在数字化时代&#xff0c;U盘已成为我们日常生活与工作中不可或缺的数据存储和传输工具。然而&#xff0c;有时我们可能会遇到一个非常令人沮丧的问题——U盘中的文件或目录突然损坏且无法读取。这种突发状况往往让人措手不及&#xff0c;甚至可能引发数据丢失的严重后果。那么…