数据结构与算法学习笔记之线性表二---顺序表的静态存储表示和实现(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/618764.html

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

相关文章

电商核心技术揭秘56: 社群营销的未来趋势与挑战

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

LeetCode100题总结

LeetCode100题总结 前言LeetCode100题总结题型梳理双指针11. 盛最多水的容器234.回文链表75.颜色分类206.反转链表142.环形链表215.三数之和 滑动窗口3. 无重复字符的最长子串209. 长度最小的子数组438. 找到字符串中所有字母异位词 广搜102. 二叉树的层序遍历200. 岛屿数量617…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时&#xff0c;格式不一样 比如 当右键单击时&#xff0c;然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪&#xff0c;就pdf的格式比较靠谱一点

LLM-KERec

1、LLM-KERec整体框架 LLM-KERec系统包括传统推荐模块和基于LLM的互补知识增强模块。传统推荐模块负责召回候选商品、粗排过滤、精排和重排。LLM互补知识增强模块则包括实体提取器、互补图构造、E-E-I权重决策模型等&#xff0c;以整合互补知识&#xff0c;增强推荐效果。 2、…

CSS滑动门

CSS滑动门使各种特殊形状的背景能够自动拉伸滑动&#xff0c;以适应元素内部的文本内容&#xff0c;其原理是&#xff1a;利用CSS精灵和盒子撑开宽度适应不同字数的导航栏。 特点&#xff1a; 1.可以根据导航字数自动调节宽度&#xff1b; 2.可以以简单的背景图实现炫彩的导航条…

【数据结构与算法】递归

// 计算 1-100 累加 function add(a, b) {return a b ? a : add(a, b - 1) b }console.log(add(1, 100))// 计算阶乘 function factorial(n) {return n < 1 ? 1 : n * factorial(n - 1) }console.log(factorial(5)) // 120理论上所有递归都可以用循环实现。 注意防止栈…

【基于element ui的color选择器】基于element ui的color选择器

技术版本如下&#xff1a; vue 2.6.14 less 3.13.1 element-ui 2.15.6 less-loader 5.0.0需求&#xff1a; 支持RGB、HEX编码、支持吸管吸取颜色、颜色选择器、颜色模板、透明度、色板、线性渐变颜色 效果图&#xff1a; 1.引入选择器的color-all文件 <template><…

STC8增强型单片机开发day03

中断系统INT 中断的概念 中断系统是为使 CPU 具有对外界紧急事件的实时处理能力而设置的。 当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求&#xff0c;要求 CPU 暂停当前的工作,转而去处理这个紧急事件&#xff0c;处理完以后&#xff0c;再回到原来被中断的…

Linux 信号保存

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 阻塞信号 1. 信号其他相关常见…

分享一个处理大文件效率拉满的神器

&#x1f3c3;‍♂️ 微信公众号: 朕在debugger© 版权: 本文由【朕在debugger】原创、需要转载请联系博主&#x1f4d5; 如果文章对您有所帮助&#xff0c;欢迎关注、点赞、转发和订阅专栏&#xff01; 前言 系统当天有些表的数据需要恢复成前一天的样子&#xff0c;幸好有…

Chrome的常用操作总结

Chrome的常用操作总结 最近的自己真的好忙啊,好久真好久没有写博客了,今天我就趁着周末的这段时间总结一下最近自己的用的Chrome浏览器常用的命令 不得不说: 就是特么的丝滑!吊打一切浏览器(不接受反驳哈哈哈)因为反驳我也不听嘻嘻 用好快捷键,就是事半功倍!!!重要的事儿说一遍…

【超详细】跑通YOLOv8之深度学习环境配置2

环境配置2下载安装内容如下&#xff1a; CUDA&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive cudnn&#xff1a;https://developer.nvidia.com/rdp/cudnn-archive 版本&#xff1a;CUDA11.3 cudnn8.9.7 CUDA安装 简介 CUDA&#xff08;Compute Unified De…

考研操作系统-1.计算机系统概述

王道考研操作系统-1.计算机系统概述 操作系统 是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;合理地组织调度计算机的工作和资源的分配&#xff1b;提供给用户和软件方便的接口和环境&#xff1b;是计算机系统中最基本的系统软件。 应包括&#xff1a; 1&#xf…

清华发布Temporal Scaling Law,解释时间尺度对大模型表现的影响

众所周知&#xff0c; 语言模型调参&#xff01; 预训练语言模型调参&#xff01;&#xff01; 预训练大语言模型调参&#xff01;&#xff01;&#xff01; 简直就是一个指数级递增令人炸毛的事情&#xff0c;小编也常常在做梦&#xff0c;要是只训练几步就知道现在的超参…

拌合楼管理系统(十九)ini配置文件本地加密

前 言&#xff1a; 项目中&#xff0c;数据库服务器与程序不在一起&#xff0c;且不允许通过互联网直接访问数据库。 解决方法是通过web服务来做中间件来解决数据交互的问题。但如果web服务交互又存在身份验证问题&#xff0c;需要实现访问对应的接口是经过授权的&#xff0c;未…

考研数学|强化阶段怎么刷《660》《880》《1000》?

强化阶段想要刷好题&#xff0c;首先要选一本适合自己的题集&#xff01; 一般在强化阶段&#xff0c;大家用多个最多的题集就是660题&#xff0c;880题还有1000题 660题的特点是只训练客观题&#xff0c;虽然题目的质量很高&#xff0c;但是训练面还是比较窄 880题是综合训…

华为交换机配置导出备份python脚本

一、脚本编写思路 &#xff08;一&#xff09;针对设备型号 主要针对华为&#xff08;Huawei&#xff09;和华三&#xff08;H3C&#xff09;交换机设备的配置备份 &#xff08;二&#xff09;导出前预处理 1.在配置导出前&#xff0c;自动打开crt软件或者MobaXterm软件&am…

C++ int 学习

在C语言中 & 是取地址符号&#xff1b; 在C中有 int& 这样的&#xff0c;这里的&不是取地址符号&#xff0c;而是引用符号&#xff1b; 引用是C对C的一个补充&#xff1b; 变量的引用就是变量的别名&#xff0c;讲的通俗一点就是另外一个名字&#xff1b; a的值…

transformer与beter

transformer与beter 解码和编码器含义tokizer标记器和one-hot独热编码编码解码--语义较好的维度空间矩阵相乘--空间变换编码理解如何构造降维的嵌入矩阵--实现到达潜空间上面是基础&#xff0c;下面是transformer正文自注意力机制注意力分数--上下文修正系数为什么需要KQ两个矩…

GO+树莓派+E53_IA1智慧农业模块

简介 之前手头上有小熊派的开发板&#xff0c; 有一个E53_IA1模块&#xff0c; 刚好用到树莓派上&#xff0c; 使用GO进行控制&#xff0c;实现智慧农业模块功能。 模块介绍 模块电路介绍 按硬件分成五块&#xff0c; 其中四块在本次用上了&#xff0c; 分别是 1. 补光模块&…