数据结构 线性表的定义和基本操作(以顺序表为例)

news2024/11/25 4:56:43

名人说:一花独放不是春,百花齐放花满园。——《增广贤文》
作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)

目录

      • 〇、线性表是什么?
        • 1、定义
        • 2、特点
        • 3、基本操作
      • 一、代码实现
      • 二、思路阐明
      • 三、样例测试

以下代码个人分享出来,仅供学习交流,且仅在CSDN平台发布,未经授权禁止二次转发。

〇、线性表是什么?

1、定义

线性表是具有相同数据类型n(n>=0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。

L=(a1,a2,a3…,an) a1为表头元素,an为表尾元素,除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素,每个元素有且仅有一个直接后继。
在这里插入图片描述

2、特点

  • ①同类型
  • ②有限
  • ③有序

3、基本操作

在这里插入图片描述

那么该怎么用代码实现基本操作呢?请往下看(以顺序表为例)

一、代码实现

#include <iostream>
using namespace std;

#define MaxSize 50
typedef int ElemType;
typedef struct {
    ElemType data[MaxSize];
    int length;
}SqList;

// 初始化线性表
void InitList(SqList &L) {
    L.length = 0;
}

// 销毁线性表
void DestroyList(SqList &L) {
    L.length = 0;
}

// 在第i个位置插入元素e
bool ListInsert(SqList &L, int i, ElemType e) {
    if (i < 1 || i > L.length + 1) return false;
    if (L.length >= MaxSize) return false;
    for (int j = L.length; j >= i; j--)
        L.data[j] = L.data[j - 1];
    L.data[i - 1] = e;
    L.length++;
    return true;
}

// 删除第i个位置的元素,并用e返回其值
bool ListDelete(SqList &L, int i, ElemType &e) {
    if (i < 1 || i > L.length) return false;
    e = L.data[i - 1];
    for (int j = i; j < L.length; j++)
        L.data[j - 1] = L.data[j];
    L.length--;
    return true;
}

// 按值查找,返回元素e的位序
int LocateElem(SqList L, ElemType e) {
    for (int i = 0; i < L.length; i++)
        if (L.data[i] == e) return i + 1;
    return 0;
}

// 按位查找,返回第i个位置的元素值
bool GetElem(SqList L, int i, ElemType &e) {
    if (i < 1 || i > L.length) return false;
    e = L.data[i - 1];
    return true;
}

// 返回线性表的长度
int Length(SqList L) {
    return L.length;
}

// 输出线性表
void PrintList(SqList L) {
    for (int i = 0; i < L.length; i++)
        cout << L.data[i] << " ";
    cout << endl;
}

// 判断线性表是否为空
bool Empty(SqList L) {
    return L.length == 0;
}

int main() {
    SqList L;
    InitList(L);
    ListInsert(L, 1, 3);
    ListInsert(L, 2, 4);
    ListInsert(L, 3, 5);
    PrintList(L);
    
    int e = -1;
    ListDelete(L, 2, e);
    cout << "删除的元素为:" << e << endl;
    
    PrintList(L);
    
    cout << "线性表长度为:" << Length(L) << endl;
    
    cout << "元素4的位置为:" << LocateElem(L,4) << endl;

}

十万个为什么:代码中为什么要传入参数的引用“&”?

因为想要将 对参数的修改结果 “带回来”

二、思路阐明

顺序表是一种线性表的存储结构。顺序表使用一段连续的存储单元来存储数据,每个数据元素占用一个存储单元。

在实现上述代码的过程中,首先使用了一个结构体来定义顺序表,其中又用了一个数组data存储数据元素,一个整型变量length用来记录线性表的长度

之后实现了多种对顺序表的操作,包括初始化、销毁、插入、删除、按值查找、按位查找、求长度、输出和判空。

  • InitList(&L)函数:初始化线性表,将长度设为0。
  • DestroyList(&L)函数:销毁线性表,将长度设为0。
  • ListInsert(&L,i,e)函数:在第i个位置插入元素e。首先判断插入位置是否合法,然后将第i个位置及之后的元素后移一位,腾出空间插入新元素,最后将线性表长度加1。
  • ListDelete(&L,i,&e)函数:删除第i个位置的元素,并用e返回其值。首先判断删除位置是否合法,然后将被删除元素的值赋给e,再将第i个位置之后的元素前移一位,最后将线性表长度减1。
  • LocateElem(L,e)函数:按值查找,返回元素e的位序。遍历线性表,找到第一个值等于e的元素并返回其位序。
  • GetElem(L,i)函数:按位查找,返回第i个位置的元素值。首先判断查找位置是否合法,然后返回第i个位置的元素值。
  • Length(L)函数:返回线性表的长度。
  • PrintList(L)函数:输出线性表。
  • Empty(L)函数:判断线性表是否为空。

最终按照顺序表的操作顺序,在main函数中进行调用测试即可,具体测试见下方样例测试,以上就是这段代码的简要实现思路。

三、样例测试

首先在1、2、3位置插入3、4、5的值,长度为3,之后删除值为4的元素,接着计算线性表的长度,由一开始的3变为了2,也表明了删除成功,在查找元素4的位置时,由于元素4已经被删除了,所以在查找函数中返回了0。

3 4 5
删除的元素为:4
3 5
线性表长度为:2
元素4的位置为:0

--------------------------------
Process exited after 0.06322 seconds with return value 0
请按任意键继续. . .

✔ 部分内容参考:王道数据结构(B站/MOOC 咸鱼学长主讲)
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
如果对大家有帮助的话,希望大家能多多点赞+关注!这样我动力会更足哦! ღ( ´・ᴗ・` )比心

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

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

相关文章

记录使用ffmpeg把mp4转换成m3u8

背景:公司需要上一些视频资源,平均每一个都在600m以上,经过考虑以后采取视频分片以后上传到oss上进行加速播放的流程.这里记录一下使用ffmpeg进行转换视频格式的过程中的一些命令. 准备工作: 下载ffmpeg到本地,以及配置ffmpeg到环境变量中,这里就不多说了. 使用的时候先打开…

软考每年成绩几月公布 软考考试历年成绩查询时间

软考成绩一般在考试结束后两个月内公布&#xff0c;上半年软考考试成绩一般在7月查询&#xff0c;下半年软考考试成绩一般在12月查询。软考成绩在中国计算机技术职业资格网公布&#xff0c;从2022年起&#xff0c;软考的合格标准为满分的60%&#xff0c;即45分合格。 软考考试…

MybatisX插件自动生成sql失效问题的详细分析

mybatis框架提供了非常好用的逆向工程插件&#xff0c;但是根据数据库驱动版本的不同会出现一些问题。 在使用mybatisX插件的时候使用Generate mybatis sql无法实现自动生成sql 解决方案&#xff1a; 1.首先检查自己的数据库中表是否有主键&#xff0c;如果没有主键是不会生…

流及其相关操作

本文已收录于专栏 《Java》 目录 概念说明流 流的分类根据数据流向的不同&#xff0c;可以分为输入流和输出流。根据处理单位的不同&#xff0c;可以分为字节流和字符流。根据功能不同&#xff0c;可以分为节点流和处理流。 提供服务过滤操作&#xff08;Filter&#xff09;映射…

后端基础:IO cell的pre driver与post driver的区别

pre driver就是接core电压的部分&#xff0c;一般叫VDD/VSS&#xff0c;post driver就是接pad的高压部分。所以power IO起到一个level shifter的作用&#xff0c;将高压转换为低压。 pre driver和post driver地共用的情况可以节省一个PAD&#xff0c;esd也很好&#xff0c;但是…

华为IMC培训——通信基础与路由协议

目录 环境搭建 wireshark安装 VirtualBox安装 WinPcap安装 eNSP安装 数据在七层模型间的传输过程 路由 静态路由 动态路由 rip OSPF 单臂路由 ——————————————————————————————————————————— 虽然是白嫖的课&#xff…

使用cmake创建visual studio工程

对于从网上拉取的C++代码,手动配置VS环境比较麻烦,使用cmake可以自动配置,这里使用一个简单的cmake配置hello.cpp例子演示 前提环境:cmake vs2017 1.在某路径下创建一个文件夹名为test:(注意:路径中不能有中文) 其中CMakeList.txt文件中输入代码如下: 其中,cmake_…

supervisor管理

supervisor 一&#xff1a;supervisor使用详解 一&#xff1a;supervisor使用详解 简介 使用文档&#xff1a;http://supervisord.org/ supervisor是Python开发的c/s服务&#xff0c;是Linux系统下的进程管理工具。 可以监听、启动、停止、重启一个或多个进程 用supervisor…

【SLAM学习】获取IMU和雷达消息并发布

本文主要记录如何将rosbag的消息进行获取并进行发布以及后续处理。 测试数据集&#xff1a; 链接: https://pan.baidu.com/s/1DthWE45V5Zhq7UUrfTt_CQ 提取码: mxvn 查看数据集bag包里面都有那些话题&#xff1a; rosbag info indoor_lab_RS.bag 可以看到包含了两个话题…

web安全php基础_php语法格式与注释

php开头与结尾 php脚本以<php 开始 以 ?>结束 但是先前创建页面的时候我们发现phpinfo只有<php开头&#xff0c;并没有&#xff1f;>结尾 在这里我们可以手动给它加上?>结尾 php强制使用分号&#xff1b;结尾 PHP指令分隔符   与C、Perl及Java一样&…

mysql的集群和主从的区别

现在的项目使用mysql数据库&#xff0c;要自己设计数据存储架构。所以研究了一下mysql的集群(cluster)和主从&#xff08;master/slave&#xff09;这两个概念。两者非常容易混淆&#xff0c;所以需要分辨出这2者之间的区别。 一、Mysql cluster: share-nothing,分布式节点架构…

综合实验---基于卷积神经网络的目标分类案例

文章目录 配置环境猫狗数据分类建模猫狗分类的实例基准模型猫狗分类的实例基准模型之数据增强问题回答 配置环境 ①首先打开 cmd&#xff0c;创建虚拟环境。 conda create -n tf1 python3.6如果报错&#xff1a;‘conda’ 不是内部或外部命令,也不是可运行的程序 或批处理文件…

Docker镜像是什么原理?Dockerfile是什么?

Dockerfile 一、docker镜像原理 Linux文件系统有bootfs和rootfs两部分组成 bootfs&#xff1a; 包含bootloader&#xff08;引导加载程序&#xff09;和kernel&#xff08;内核&#xff09;rootfs&#xff1a; root文件系统&#xff0c;包含的就是典型Linux系统中的 /dev&…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册4

目录 1、秋千 2、跷跷板 3、搅拌器 4、奇怪的钟 5、起重机 6、烤肉架 7、手摇风扇 8、履带车 9、直升机 10、后轮驱动车 钟表是一种计时的装置&#xff0c;也是计量和指示时间的精密仪器。 钟表通常是以内机的大小来区别的。按国际惯例&#xff0c;机芯直径超过80毫米、厚度超…

Axure设计之下拉复选框(中继器)

在系统表单设计中经常用到下拉复选框&#xff0c;下拉复选列表用于展示可选标签&#xff0c;并允许用户选择多个标签&#xff0c;那么该如何利用Axure RP9制作一个下拉复选框呢&#xff1f;本文总结了设计过程的所需元件和整体思路&#xff0c;通过对关键步骤的讲解&#xff0c…

Type-c取电方案

如今随着这几年的USB-C PD适配器的普及&#xff0c;消费者手上的PD协议适配器越来越普遍&#xff0c;如何让微软surface 充电器线支持使用PD适配器快充&#xff1f;加入一颗受电端PD协议取电芯片——LDR6328能够完美的兼容市面上的PD适配器&#xff0c;支持不同的电压输出。 1…

vuex 持久化插件 vuex-persistedstate

/** ** /store/index.js ****/ import Vue from vue import Vuex from vuex import createPersistedState from vuex-persistedstate // 【主要代码】Vue.use(Vuex)// https://webpack.js.org/guides/dependency-management/#requirecontext const modulesFiles require.conte…

使用alist连接百度网盘和阿里云盘挂载到本地磁盘

1、下载alist软件 使用alist连接百度网盘和阿里云盘挂载到本地磁盘 跳转后&#xff0c;找到对应windows版本 2 、下载后解压&#xff0c;并启动服务 注意&#xff1a;alist的启动方式不是传统的双击启动&#xff0c;需要用命令提示符,启动服务 下载完成后解压&#xff0c;在你解…

MySQL - 第13节 - MySQL用户管理

1.MySQL用户管理概念 MySQL用户管理概念&#xff1a; • 与Linux操作系统类似&#xff0c;MySQL中也有超级用户和普通用户之分。 • 如果一个用户只需要访问MySQL中的某一个数据库&#xff0c;甚至数据库中的某一个表&#xff0c;那么可以为其创建一个普通用户&#xff0c;并为…

HarmonyOS学习路之开发篇—设备管理(传感器开发)

传感器开发概述 基本概念 HarmonyOS传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor API&#xff0c;可以查询设备上的传感器&#xff0c;订阅传感器的数据&#xff0c;并根据传感器数据定制相应的算法&#xff0c;开发各类应用&#xff0c;…