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

news2024/11/17 19:52:14

名人说:一花独放不是春,百花齐放花满园。——《增广贤文》
作者: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/696075.html

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

相关文章

统计图echarts和antd charts的那些事

以下记录的是&#xff0c;我在学习中的一些学习笔记&#xff0c;这篇笔记是自己学习的学习大杂烩&#xff0c;主要用于记录&#xff0c;方便查找&#xff0c;如需转载请著名原文作者和地址 一、echarts 相关 ##1、echarts 在react的使用 npm install echarts --save //初始化…

[web]前端富文本编辑器

关于富文本编辑器 在HTML中&#xff0c;用于输入文本的只是<input type"text"/>和<textarea>这2种标签&#xff0c;这些标签都只能输入纯文本&#xff0c;不可以对输入的内容进行编排&#xff01; 在实际应用时&#xff0c;例如发布文章&#xff0c;需要…

asdasdadsadsadsc

C中类和结构体的区别 类中默认权限是私有&#xff0c;结构体内默认权限是公有结构体的默认继承方式是public&#xff0c;类的默认继承方式是privat

uniapp的navigator页面跳转遇到的问题

文章目录 先看路由index组件login组件最后再从index转到login&#xff08;问题&#xff09; 先看路由 主页默认加载的index "pages": [ //pages数组中第一项表示应用启动页&#xff0c;参考&#xff1a;https://uniapp.dcloud.io/collocation/pages{"path"…

基于kubesphere的k8s环境部署三节点的rook-ceph集群

文章目录 前言链接&#xff1a;[基于kubesphere的k8s环境部署单点版本的rook-ceph](https://blog.csdn.net/baidu_35848778/article/details/131050918) 一、rook-ceph是什么&#xff1f;二、开始部署2.1 环境准备2.2 软件包准备&#xff0c;计算\存储节点执行2.3 下载rook-cep…

关于我想安装cuda11.8版本的torch

先开始去官网PyTorch 用这个官网的命令下&#xff0c;一直会把cpu版本的一起下下来&#xff0c;导致运行的时候一直cpu版本而不是gpu版本&#xff0c;torch.cuda.is_available()这个是false&#xff0c;问题很大。 重新去搜了个命令&#xff1a;pip install torch1.8.0cu111 t…

Vue+Element-ui实例_日历排班(自定义)

在日常开发需求中&#xff0c;可能会遇到给员工进行排班的需求&#xff0c;如果只是在table表格中显示&#xff0c;会显得枯燥、不直观&#xff0c;今天我们就来写一个可以自定义的日历排班功能&#xff0c;用的是vue2element-ui。 效果图如下&#xff1a; (图一)&#xff1a;…

输出流(写)学习

选择子类&#xff1a;FileOutputStream 文件输出字节流 看到的是d 说明会查询ASCII表 写入记事本时&#xff0c;一个字母是一个字节 public static void main(String[] args) throws Exception {FileOutputStream fos new FileOutputStream("e:\\asd.txt");byte[]…

☆Image captioning☆论文show,attend and tell的程序中create_input_files.py代码详解

手把手实现Image captioning,论文show,attend and tell的程序中create_input_files.py代码详解。如果感觉有用,不妨给博主来个一键三连,白天科研,晚上肝文,实属不易~ ~ ](https://imgse.com/i/p9FmMDK) 1. 代码解析(1) assert dataset in {coco, flickr8k, flickr30k…

【计算机网络】数据链路层--MAC媒体接入控制

1.概念 2.静态划分信道 2.1 频分复用 2.2 时分复用 2.3 波分复用 2.2 码分复用 2.3 习题1 2.4 应用举例 2.5 习题2 2.6 习题3 3.小结

服务器设置tomcat开机自启动(cmd命令行语句,tomcat注册到服务里)

1、找到tomcat安装目录&#xff0c;进入bin/文件夹下面&#xff0c;在此打开windows 命令行窗口。 2、输入 service install tomcatXXX 将tomcat注册成为windows服务&#xff0c;其中tomcatXXX为服务名。 3、查看刚刚注册的服务 “我的电脑”-》右键管理 发现刚刚的服务是手…

Stable Diffusion 无损放大图像和缩小图像

Stable Diffusion默认生成的图片尺寸为512512&#xff0c;这种尺寸的分辨率可能无法满足高质量的要求。若想生成大图&#xff0c;存在两种可选的方法&#xff0c;在显卡足够支撑的情况下可以将图像当打到8K。 文章目录 hires.fix高分辨率修复extras附加功能放大功能缩放功能 hi…

VirtualBox 开启硬件虚拟化

最近用VirtualBox开了一台centos7的虚拟机&#xff0c;想用虚拟机搭建一个KVM环境&#xff0c; 结果发现Virtualbox开启虚拟化的选项是灰色的&#xff0c;无法选择&#xff0c; 解决方法&#xff1a;进入virtualbox安装目录&#xff0c;打开cmd&#xff0c;进入命令行模式打开嵌…

使用NVM下载和安装NodeJS教程

NodeJS下载与安装教程 一、下载 NVM二、安装 NVM三、安装 Node四、配置 NVM 和 NodeJS4.1 配置环境变量4.2 配置node_global和node_cache 这里我是用的 NVM 下载&#xff0c;后期管理 Node 版本很方便&#xff0c;推荐这种方式&#xff0c;还有一种方式是直接下载 NodeJS 进行安…

PPT如何跨页让图像对齐?

例如&#xff1a; 第1页和第2页的图片&#xff0c;希望2张图片在ppt中是固定的位置。 选择视图菜单栏&#xff0c;勾选参考线。 页面空白处&#xff0c;鼠标右键点击&#xff0c;显示菜单栏&#xff0c;选择添加水平或垂直参考线。 拖动参考线到想要的位置&#xff0c…

elementUI表格勾选框判断选择相同的内容才能进行后续逻辑处理;否则拦截提示

需求是&#xff1a; 可多选需满足条件&#xff1a;同一个年级、同一个分数&#xff1b; 不满足条件给出提示&#xff1a;请选择同一个年级 、分数的学生 1、先对勾选数据进行赋值 /** 表格复选框勾选 */handleSelectionChange(val) {console.log(val)this.tableSelectArr va…

5.7.1 UDP概述

5.7.1 UDP概述 用户数据报UDP协议是在IP数据报服务之上增加了两个内容 端口的复用和分用差错控制 一、UDP特点 UDP特点TCP特点无连接面向连接不可靠的服务可靠的服务点到点和多点通信点到点的通信首部8字节首部固定部分20字节面向报文面向字节流 UDP是无连接的服务&#x…

想做一个简单功能小程序需要多久

对于小程序开发的新手来说&#xff0c;往往会有这样一个问题&#xff1a;想做一个简单功能的小程序&#xff0c;大概需要多久时间呢&#xff1f;实际上&#xff0c;这个问题的答案取决于许多因素&#xff0c;包括你的开发技能、你计划实现的功能以及你为项目投入的时间等。 首…

建筑企业缺成本票,怎么解决?学会这几招可胜券在握!

建筑企业缺成本票&#xff0c;怎么解决&#xff1f;学会这几招可胜券在握&#xff01; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 建筑行业业务流程的特点是一般建筑工期的周期长&#xff0c;涉及的施工人员构成十分复杂&#x…

Docker安装,常用命令,部署MySQL,Tomcat,nginx,redis

Docker简介 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship and Run Any App,Anywhere”&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应用等等…