线性表的顺序表示及其基本函数操作

2023-05-16

线性表:线性表是零个或多个数据元素构成的线性序列,可以记为a0,a1,a2…an-1;
注:n表示的是线性表的长度,当n=0的时候并不是表示线性表不存在,而是表示表为空。
相关概念:
直接前驱:某一数据元素的所对应的前一个元素
直接后继:某一数据元素的所对应的后一个元素
值得注意的是,a0是表的第一个元素,所以没有直接前驱,an-1是表的最后一个元素,所以没有直接后继。
数据结构包括有逻辑结构、存储结构、运算。也就是说,在存储数据的时候,我们不仅要关注数据的类型,更要关注各个数据之间的关系。

1.线性表的顺序存储结构
其概念是:使用连续的内存空间,按照数据元素在线性表中的的序号依次存储数据元素。而采用顺序存储结构的表被称为顺序表。
下面给的是顺序表的存储结构的基本模板

#define MAXSIZE 25//初步定义所需要的最大存储空间
typedef int ElemType;//数据的类型,这里先默认为int类型,可以根据需要来进行定义
typedef struct 
{
    ElemType data[MAXSIZE];//注:这里的分配是数组的静态分配,数组的大小已经确定了,有另外一种形式是:
    ElemType *data;//这种的是数组动态分配
    int length;//记录下的是线性表当前的长度
}Sqlist;

注意:如果是动态分配类型的话,则需要配套语句:(C语言)

Sqlist L;
L.data=(ElemTpye *)malloc(MAXSIZE*sizeof(ElemType));
/*当使用完毕后*/
free(L.data);

但这样写略写繁琐,在C++中,我们通常用new这个方法来等价上述的操作。
使用样例:

int *p1=new int ;
//语法阐述:定义一个指针变量,通过new的方法,创建一个新的内存空间,内存空间的大小用来存放一个int类型的数据,如果new成功,那么就把new出来的内存空间地址赋给p1
int *p1=new int(10);//语法阐述:通过new的方法,创建一个新的内存空间,内存空间的大小用来存放一个int类型的数据,如果new成功,那么就把new出来的内存空间地址赋给p1,同时,把括号里面的值赋给内存中相对应的变量。
/*而free的操作就是delete 创建出来的指针p即可*/

如果new失败了就会返回NULL

常用的语言抽象

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//status表示的是函数返回值类型,根据实际情况的变化而变化
typedef int Status;
typedef int ElemType;

由此可知顺序表所需要的三个基本元素是:
①顺序表的最大长度:MAXSIZE
②顺序表当前的长度:length
③顺序表的存储位置,即data数组

在顺序表中,第一个元素的位置是很关键的,由于线性表的数据存储结构是连续的,而物理上的存储结构也是连续的,那么如果我们知道第一个元素的位置,那么我们想要找到有关的元素,可以采用公式:loc(ai+n)=loc(ai)+n*c
注:其中loc代表的是线性表中元素的位置,ai及ai+n代表的是元素的下标,c代表的是每个元素占据的字节空间。
由此公式可以知道,当在顺序线性表中进行查找操作的时候,其进行计算的函数公式都是线性的,即时间复杂度是一个常数。这一类的存储、取出特点被称为是随机存储结构

线性表的基本操作:
创建一个空的线性表L Initlist(&L)
这里传入的参数是一个引用型的变量。

Status InitList(Sqlist &L)
{
    L.elem=new ElemType[MAXSIZE];//用new的方法为表分配空间,那么这里对应的就是用*elem的类型,因为new之后传回来的是地址
    if(!L.elem)//分配失败
    {
        exit(OVERFLOW);
    }
    else//分配成功
    {
        L.length=0;//空表的长度为0
        return OK;
    }
}

销毁一个线性表 DestroyList(&L)

void DestoryList(Sqlist &L)
{
    if(L.elem)
    {
        delete L.elem;//释放存储空间
    }
}

线性表的重置 ClearList(&L)
说明一下,重置的意思是表依然占用着内存空间,但是长度为0了,表示的是里面所有的元素都找不到了,现在要往内存空间里面重新写入数据。

void ClearList(Sqlist L)//将线性表的长度变为0
{
    L.length=0;
}

判断线性表是否为空 ListEmpty(L)

int ListEmpty(Sqlist L)
{
    if(L.length==0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

求线性表的长度 ListLength(L)

int ListLength(Sqlist L)
{
    return (L.length);
}

取出操作 GetElem(L,i,&e):
取出即通过遍历表的方式,找到相对应的元素之后,返回对应的元素值。在上面已经定义好了一个线性表的情况下,现在给出取出元素的代码。根据位置i(指的是物理意义上的位置),获取相应位置上的内容。
初始条件:线性表已经存在,而且线性表的长度满足 1<=i<=ListLength(L)
结果是用e返回线性表中第i个元素。
注:OK/ERROR代表的是1/0,,通过define的方法进行定义换名。

int GetElem(Sqlist L,int i,ElemType &e)
{
    if(i<1||i>L.length)
    {
        return ERROR;
    }
    
    else
    {
        e=L.elem[i-1];//比如说我要第一个元素,那么对于数组来说,它的下标就是0,那么就要返回对应i-1下标的对应数组元素
        return OK;
    }
}

查找直接元素 LocateElem(L,e,compare())
在线性表中查找与指定值e相同的数据元素的位置,算法:从表的一端开始,逐个进行记录的关键字和给定值的比较,找到则返回该元素的位置序号,未找到则返回0。

int LocateElem(Sqlist L,ElemType e)
{
    for(int i=0;i<L.length;i++)
    {
        if(L.elem[i]==e)
        {
            return i+1;
        }
    }
    return ERROR;
}

查找直接前驱 PriorElem(L,cur_e,&pre_e)

int PriorElem(Sqlist L,ElemType cur_e)//找到前并且返回其下标
{
    int pos=LocateElem(L,cur_e);
    if(pos==1)
    {
        return ERROR;
    }
    else
    {
        return pos-1;
    }
}

查找直接后继 NextElem(L,cur_e,&next_e)

int NextElem(Sqlist L,ElemType cur_e)
{
    int pos=LocateElem(L,cur_e);
    if(pos==L.length)
    {
        return ERROR;
    }
    else
    {
        return pos+1;
    }
}

插入操作 ListInsert(&L,i,e) **
要实现的是,在线性表L中的第i的位置,插入元素e,函数元素可定义为ListInstert(*List L,int i,int e);其中int可以替换为任意数据结构类型。插入算法的实现注意点:
1.如果插入的位置不合理,无法用算法实现,抛出异常
2.如果线性表的长度大于等于数组的长度,那么就抛出异常或者是动态增加数组的长度
3.从
最后一个元素**遍历到第i个元素,分别都将他们都向后移动一个位置。
4.将要插入的元素填入位置i中
5.整个表长+1
实现代码如下:

Status ListInsert(Sqlist &L,int i,ElemType e)
{
    if(i<1||i>L.length+1)//判断插入位置是否合法
    {
        return ERROR;
    }
    if(L.length==MAXSIZE)//判断是否有空余的位置供插入
    {
        return ERROR;
    }
    else//插入算法的实现
    {
        for(int j=L.length-1;j>=i-1;j--)//这个写法在C99 MODE下不规范
        {
            L.elem[j+1]=L.elem[j];
        }
        L.elem[i-1]=e;
        L.length++;
        return OK;
    }
}

删除操作 ListDelete(&L,i,&e)
和插入的核心算法类似,这里给出四步:
F:判断删除的位置是否合理
S:将想要删除的元素保留在e中
T:将i+1位的元素到n位的元素向前移动一个位置
FO:表长+1
代码如下

Status ListDelete(Sqlist &L,int i)
{
    if(i<1||i>L.length)
    {
        return ERROR;
    }
    for(int j=i;j<L.length;j++)
    {
        L.elem[j-1]=L.elem[j];
    }
    L.length--;
    return OK;
}

完整的代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100//初步定义所需要的最大存储空间
typedef int ElemType;//数据的类型,这里先默认为int类型,可以根据需要来进行定义
typedef int Status;

typedef struct
{
    ElemType *elem;//注:这里的分配是数组的静态分配,数组的大小已经确定了,有另外一种形式是:
    int length;//记录下的是线性表当前的长度
}Sqlist;

using namespace std;

Status InitList(Sqlist &L)
{
    L.elem=new ElemType[MAXSIZE];//用new的方法为表分配空间,那么这里对应的就是用*elem的类型,因为new之后传回来的是地址
    if(!L.elem)//分配失败
    {
        exit(OVERFLOW);
    }
    else//分配成功
    {
        L.length=0;//空表的长度为0
        return OK;
    }
}

void DestoryList(Sqlist &L)
{
    if(L.elem)
    {
        delete L.elem;//释放存储空间
    }
}

void ClearList(Sqlist L)//将线性表的长度变为0
{
    L.length=0;
}

int ListLength(Sqlist L)
{
    return (L.length);
}

int ListEmpty(Sqlist L)
{
    if(L.length==0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int GetElem(Sqlist L,int i,ElemType &e)
{
    if(i<1||i>L.length)
    {
        return ERROR;
    }

    else
    {
        e=L.elem[i-1];//比如说我要第一个元素,那么对于数组来说,它的下标就是0,那么就要返回对应i-1下标的对应数组元素
        return OK;
    }
}

int LocateElem(Sqlist L,ElemType e)
{
    for(int i=0;i<L.length;i++)
    {
        if(L.elem[i]==e)
        {
            return (i+1);
        }
    }
    return 0;
}

Status ListInsert(Sqlist &L,int i,ElemType e)
{
    if(i<1||i>L.length+1)//判断插入位置是否合法
    {
        return ERROR;
    }
    if(L.length==MAXSIZE)//判断是否有空余的位置供插入
    {
        return ERROR;
    }
    else//插入算法的实现
    {
        for(int j=L.length-1;j>=i-1;j--)//这个写法在C99 MODE下不规范
        {
            L.elem[j+1]=L.elem[j];
        }
        L.elem[i-1]=e;
        L.length++;
        return OK;
    }
}

Status ListDelete(Sqlist &L,int i)
{
    if(i<1||i>L.length)
    {
        return ERROR;
    }
    for(int j=i;j<L.length;j++)
    {
        L.elem[j-1]=L.elem[j];
    }
    L.length--;
    return OK;
}

int PriorElem(Sqlist L,ElemType cur_e)//找到前并且返回其下标
{
    int pos=LocateElem(L,cur_e);
    if(pos==1)
    {
        return ERROR;
    }
    else
    {
        return pos-1;
    }
}

int NextElem(Sqlist L,ElemType cur_e)
{
    int pos=LocateElem(L,cur_e);
    if(pos==L.length)
    {
        return ERROR;
    }
    else
    {
        return pos+1;
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性表的顺序表示及其基本函数操作 的相关文章

  • python小白友好几个学习刷题网站安利

    前言 1 github 网站 xff1a https github com pypa pipenv 作为学习网站它的特点是 python的项目很多 xff0c 可以搜索自己感兴趣的项目练练手 xff08 文末送福利 xff09 而且这是一个
  • Python入门|零基础教程

    前言 俗话说的好 xff1a Python学的好 xff0c 工作不愁找 xff0c 不管我们学习哪一门语言 xff0c 我们都要掌握从抽象化中提取出来的方法 xff0c 这样你才能提高我们的学习能力 xff0c 并且在学习新事物的时候可以
  • 财务福音!用Python+OCR人工智能识别发票自动存入Excel表格保姆级教程

    前言 对于所有公司财务而言 xff0c 用肉眼看发票 xff0c 再将信息手动录入excel绝对是人间十大酷刑之一 xff0c 对于这种流程清晰 xff0c 机械重复的工作场景 xff0c 最适合用python自动化办公技术 43 人工智能
  • python下载安装教程

    1 下载python 下载地址 xff1a https www python org xff0c 点击Downloads 选择对应电脑系统 xff0c 进行下载 xff08 文末送读者福利 xff09 2 安装python xff0c 以p
  • windows修改环境变量

    windows的环境变量有两套 xff1a 系统的当前用户的 不同的用户可以拥有不同的环境变量 xff0c 当前用户的环境变量优先级比系统的环境变量优先级高 xff0c PATH环境变量比较特殊 xff0c 它不是替换而是拼接 在命令行下也
  • 为什么不建议学python

    前言 目前信息化产业发展势头很好 xff0c IT就成为了很多普通人想要涉及的行业 xff0c 因为相比于传统行业 xff0c IT行业涨薪幅度大 xff0c 机会也多 xff0c 所以就会大批的人想要转行来学习Python开发 目前来讲市
  • 学完python可以从事哪些行业?

    前言 1 web开发 对于一些网站的开发 xff0c 诸如后台管理系统 xff0c 或者一些微服务 xff0c 写一些接口 xff0c 都可以使用 Python 实现 Python有很多优秀的Web开发框架 xff0c 如Flask Dja
  • 0基础学Python爬虫2个月怎么赚钱?了解一下

    前言 Python是一门编程语言 xff0c 一门技术 xff0c 一个生产力工具 只要你能掌握生产工具 xff0c 就能赚钱 xff0c 也许能像那位知乎大神一样躺赚200万 xff0c 即便不能 xff0c 至少赚个外快是没有问题的 x
  • 年薪30w+,为啥大数据工程师才是真正的高富帅?

    前言 大家有没有过这样的经历 xff1a 朋友圈推送的广告越来越频繁 xff0c 恰恰还是前几天想买的 xff1f 在某宝搜了款键盘 xff0c 结果往后很多天一直精准推送键盘 xff0c 还一个比一个贵 刷视频手滑点赞美食视频 xff0c
  • 这才是最适合新手的python基础教程,640页超详细

    前言 python入门虽然简单 xff0c 很多新手依然卡在基础安装阶段 xff0c 大部分教程对一些基础内容都是一带而过 xff0c 好多新手朋友 xff0c 对一些基础知识常常一知半解 xff0c 需要在网上查询很久 扎实的基础知识 x
  • python数据预测——学习数据分析需要多少python基础?

    前言 工欲善其事 必先利其器 xff0c 搭建Python环境 学习Python语言 理解数据分析工作是入行Python数据分析最基本的三要素 但是还要有个最重要的前提是经验和思维 这个过程就好比做日料 xff0c 首先要有厨具 xff0c
  • python副业介绍以及渠道推荐,接单注意事项

    这是本文的目录 前言Python为什么会大受欢迎python副业有哪些1 兼职处理数据2 兼职查询资料3 兼职P图4 爬虫类5 平台接单 Python赚外快的一些其它方式1 xff09 自媒体也是个风口2 xff09 知识付费分享3 xff
  • python的未来前景,超详细根据好多资料总结出来的

    这是本文的目录 前言一 Python语言广泛二 Python发展前景二 Python选择方向四 Python就业情况五 薪资待遇好零基础Python学习资源介绍 x1f449 Python学习路线汇总 x1f448 x1f449 Pytho
  • 如何将python程序打包成apk?

    前言 如果想使用 Python 语言编写图形界面程序 xff0c 那么有不少的框架可以提供支持 xff0c 比如 Tkinter Qt for Python WxPython等等 不过 这些框架都是只能创建桌面图形界面程序 xff0c 比如
  • 容联云短信python接口单例封装

    容联云短信python接口单例封装 安装pip3 install ronglian sms sdk 注意 xff1a 免费开发测试使用的模板ID为1 xff0c 具体内容 xff1a 云通讯 您的验证码是 1 xff0c 请于 2 分钟内正
  • mac 更新终端命令行显示信息

    mac下自定义终端显示内容 xff0c 如自定义 xff0c 显示名称 xff0c 隐藏计算机名 xff0c 用户名 1 编辑 etc bashrc xff0c 使用如下命令 sudo vi etc bashrc 2 打开文件后 xff0c
  • React Fragment 用途说明-节点片段,不创建额外DOM

    一 React 节点片段解决的问题 由于React 组件只能有一个根标签 xff0c 例如以下片段无效 xff1a ReactDOM render lt div gt Row1 lt div gt lt div gt Row2 lt div
  • 分布式延迟消息队列asynq

    asynq分布式延迟消息队列源码分析 设计思路 延迟队列设计思路 xff1a zset的分值为时间消息有状态 xff1a 活跃 xff0c 计划中 xff0c 重试 xff0c 已完成等 xff0c 状态迁移使用list xff0c 如果状
  • jmeter设置为中文的两种方法

    jmeter默认是英语环境 xff0c 但是可以通过设置来显示为中文 方法一 xff1a 在jmeter面板上选择Options gt Choose Language gt Chinese 但是这种方法设置的只能在当前界面生效 xff0c
  • requests常用方法 之 post请求

    post方法 xff1a 作用 xff1a 提交资源 新增资源 步骤 xff1a 1 导包 xff1a import requests 2 参数 3 调用post方法 xff1a r 61 requests post url json da

随机推荐

  • postman全局变量设置

    postman全局变量的设置 xff1a 设置的全局变量可以供postman所有的工程使用 xff0c 即所有接口都可以调用全局变量 示例1 xff1a 对手机号码归属地查询的手机号码设置为全局变量 xff0c 并调用 步骤1 点击Envi
  • postman使用(读取)json文件做批量测试

    postman json文件参数化 xff1a 步骤 xff1a 1 准备json文件 xff1b 2 接口中引用变量 xff1b 3 测试集中导入数据文件 xff1b 4 点击 Run用户 xff0c 进行运行 xff1b 5 查看运行结
  • selenium 八种定位元素的方式

    八种定位方式 xff1a id xff0c name xff0c class name xff0c tag name xff0c link text xff0c partial link text xff0c xpath xff0c css
  • selenium之滑块操作

    滑块作为安全验证机制的一种 xff0c 经常在登录或者注册时涉及 但是在自动化测试时 xff0c 需要想办法用代码的方式来处理滑块 selenium中对滑块的操作基本是采用元素拖曳的方式 xff0c 而这种方式需要用到selenium的Ac
  • HTML + CSS 实现猫眼电影静态页面

    HTML 43 CSS 实现猫眼电影静态页面 效果图 xff1a HTML代码 xff1a span class token doctype span class token punctuation lt span span class t
  • HTML + CSS 实现豆瓣首页

    HTML 43 CSS 实现豆瓣首页 效果图 xff1a 整个首页效果图 xff1a 部分 HTML代码 xff1a span class token doctype span class token punctuation lt span
  • python实现加减乘除计算

    python实现加减乘除计算 xff1a span class token comment coding 61 utf 8 span span class token keyword def span span class token fu
  • python获取浏览器Chrome/Edge的收藏夹,历史记录(搜索记录,访问记录,下载记录),密码数据

    文章目录 1 获取思路2 获取书签收藏夹3 获取历史记录3 获取浏览器保存的密码数据3 1 读取数据库文件Login Data3 2 获取密钥 4 完整代码获取 1 获取思路 浏览器的这些数据是保存在我们本地的磁盘中 xff0c 所以我们需
  • django框架初体验 --- 在web页面中返回文本

    django框架初体验 在web页面中返回文本hello django 效果图 xff1a 在views py中新建函数 xff1a span class token keyword from span django span class
  • django框架初体验 --- 返回静态页面

    django框架初体验 返回静态页面 效果图 xff1a 1 在templates中新建html xff1a span class token doctype span class token punctuation lt span spa
  • django框架初体验 --- 返回动态页面

    django框架初体验 返回动态页面 效果图 xff1a 1 在templates中新建music html xff1a span class token doctype span class token punctuation lt sp
  • Linux系统下etc/profile文件配置多个环境变量

    小白也能懂的Linux系统下etc profile文件配置多个环境变量操作 1 su root进入管理员操作 2 vi etc profile 3 找到export path xff1b 按 i 在下面输入环境变量信息 xff08 一定要输
  • 如何查询电脑本机出厂序列号

    WIN 43 R 快捷键输入 cmd 回车 xff0c 输入 wmic bios get serialnumber 回车 xff0c 可以查看产品序列号Serial Number
  • C++变长参数解包与std::tuple的遍历输出

    介绍几种常用的变长参数解包的方法 xff1a 递归解包 span class token keyword template span span class token operator lt span span class token ke
  • docker-compose的安装及使用

    1 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具 通过 Compose xff0c 您可以使用 YML 文件来配置应用程序需要的所有服务 然后 xff0c 使用一个命令 xff0c 就可以从 YML 文件配置中
  • copilot插件使用介绍

    copilot xff08 副驾驶 xff09 是OpenAI和GitHub联合构建的一个基于AI的编程辅助工具 官网地址 xff1a https copilot github com 利用网络中的数十亿行公共代码 xff08 尤其是开源在
  • SQL的分组查询

    一 在SQL中Group By从字面的意思上理解就是根据 By 指定的规则对数据进行分组 xff0c 所谓的分组就是将一个 数据集 划分成若干个 小区域 xff0c 然后针对若干个 小区域 进行数据处理 在此语法中group by子句为列中
  • windows环境下安装配置hadoop

    xff08 需要提前安装好JDK xff0c 否则会出错 xff09 1 进入 https archive apache org dist hadoop 下载所需要的hadoop版本 xff08 演示 xff1a hadoop 2 9 1
  • Idea 2021.1启动提示 找不到com/intellij/idea/main

    Idea 2021 1启动提示 找不到com intellij idea main 背景 xff1a 问题描述 xff1a 原因分析 xff1a 解决方案 xff1a 简单的说就是一句话安装JDK11 并配置环境变量IDEA JDK 64指
  • 线性表的顺序表示及其基本函数操作

    线性表 xff1a 线性表是零个或多个数据元素构成的线性序列 xff0c 可以记为a0 a1 a2 an 1 注 xff1a n表示的是线性表的长度 xff0c 当n 61 0的时候并不是表示线性表不存在 xff0c 而是表示表为空 相关概