#数据结构 线性表的顺序存储

目录

每日文案

一、线性表的定义

二、线性表的操作

顺序表的存储结构

顺序表的初始化操作 

判断顺序表是否为空表

将顺序表置为空表

 计算顺序表中的元素个数

取出顺序表中的对应位置元素

 取出对应数值的位序

 在对应位置插入元素

将对应位置的元素删除

 将顺序表中的数据打印出来

 将顺序表A和B进行合并

总结


每日文案

失去的东西,其实从来未曾真正属于的属于你,也不必惋惜


一、线性表的定义

        线性表是:零个或者多个数据元素的有限序列

        这里我强调几个地方,首先是序列,那么就是有序的,如果说有多个元素,那么第一个元素就没有前驱的,最后一个元素是没有后继的,其他的元素有且仅有一个前驱和后继。就像是幼儿园开小火车,如果一个小朋友去拉后面两个小朋友的衣服那么就不可以排成一队了,如果多个小朋友拉扯那就是在打架了.

        然后线性表强调的是有限性,线性元素的个数n定义为线性表的长度,如果n=0那么线性表就是一个空表,并且每个数据元素都有确定的位置,比如说a1是第一个元素,那么他的位序就是1 同理Ai 就是在线性表的位序就是i 

        这里举个例子,班级同学的花名册,其中包含着同学的学号,姓名,性别等等信息构成一个表这个也是一个线性表,这里需要强调一个概念,在复杂的线性表中,一个数据元素可以由若干个数据项组成,这里我们表格里面的姓名学号这些都是数据项,他们连起来构成了数据元素,最后串起来构成了数据项

二、线性表的操作

  • 顺序表的存储结构

#include "stdio.h"    #include "stdlib.h"  
#include "math.h"  
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0#define MAXSIZE 20          /* 存储空间初始分配量 */
typedef int ElemType;       /* ElemType类型根据实际情况而定,这里假设为int */
typedef struct
{ElemType data[MAXSIZE]; /* 数组,存储数据元素 */int length;             /* 线性表当前长度 */
}SqList;typedef int Status;         /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
  • 顺序表的初始化操作 

/* 初始化顺序线性表 */
Status InitList(SqList *L) 
{ L->length=0;return OK;
}
  • 判断顺序表是否为空表

/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(SqList L)
{if (L.length == 0)return TRUE;elsereturn FALSE;
}
  • 将顺序表置为空表

/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(SqList L)
{ if(L.length==0)return TRUE;elsereturn FALSE;
}
  •  计算顺序表中的元素个数

/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(SqList L)
{return L.length;
}
  • 取出顺序表中的对应位置元素

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */
Status GetElem(SqList L,int i,ElemType *e)
{if(L.length==0 || i<1 || i>L.length)return ERROR;*e=L.data[i-1];return OK;
}
  •  取出对应数值的位序

/* 初始条件:顺序线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int LocateElem(SqList L,ElemType e)
{int i;if (L.length==0)return 0;for(i=0;i<L.length;i++){if (L.data[i]==e)break;}if(i>=L.length)return 0;return i+1;
}
  •  在对应位置插入元素

        第一步先是判断完顺序表的状态是否是满的,插入位置是否合法

        第二步判断是否在表尾,在表尾就直接插入,不在表尾需要将原来位置的数据向后移动一位然后再把数据插入

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(SqList *L,int i,ElemType e)
{ int k;if (L->length==MAXSIZE)  /* 顺序线性表已经满 */return ERROR;if (i<1 || i>L->length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */return ERROR;if (i<=L->length)        /* 若插入数据位置不在表尾 */{for(k=L->length-1;k>=i-1;k--)  /* 将要插入位置之后的数据元素向后移动一位 */L->data[k+1]=L->data[k];}L->data[i-1]=e;          /* 将新元素插入 */L->length++;return OK;
}

 

  • 将对应位置的元素删除

        第一步也是先判断顺序表状态

        第二步把后面的数据往前移动进行数据覆盖,我们不能直接对内存中的数据进行操作,只能将后面的数据进行覆盖

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(SqList *L,int i,ElemType *e) 
{ int k;if (L->length==0)               /* 线性表为空 */return ERROR;if (i<1 || i>L->length)         /* 删除位置不正确 */return ERROR;*e=L->data[i-1];if (i<L->length)                /* 如果删除不是最后位置 */{for(k=i;k<L->length;k++)/* 将删除位置后继元素前移 */L->data[k-1]=L->data[k];}L->length--;return OK;
}

  •  将顺序表中的数据打印出来

/* 初始条件:顺序线性表L已存在 */
/* 操作结果:依次对L的每个数据元素输出 */
Status ListTraverse(SqList L)
{int i;for(i=0;i<L.length;i++)visit(L.data[i]);printf("\n");return OK;
}
  •  将顺序表A和B进行合并

/*将所有的在线性表Lb中但不在La中的数据元素插入到La中*/
void unionL(SqList *La,SqList Lb)
{int La_len,Lb_len,i;ElemType e;                        /*声明与La和Lb相同的数据元素e*/La_len=ListLength(*La);            /*求线性表的长度 */Lb_len=ListLength(Lb);for (i=1;i<=Lb_len;i++){GetElem(Lb,i,&e);              /*取Lb中第i个数据元素赋给e*/if (!LocateElem(*La,e))        /*La中不存在和e相同数据元素*/ListInsert(La,++La_len,e); /*插入*/}
}

总结

本次对数据结构中的顺序表进行讲解,前路还有很远,给我坚持住了

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

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

相关文章

1.Python数据分析—数据分析与挖掘详讲

1.Python数据分析—数据分析与挖掘详讲 一个人简介二数据分析与挖掘概述三什么是数据分析和挖掘四数据分析与挖掘在不同领域的应用4.1医疗领域&#xff1a;4.1.1 建立疾病数据库&#xff1a;4.1.2 临床决策支持&#xff1a;4.1.3 疾病预警和监控&#xff1a; 4.2 电子商务领域&…

第12章 指针

以下内容是学习尚硅谷 12.1 指针基本介绍 1&#xff09;指针是C语言的精华&#xff0c;也是C语言的难点 2&#xff09;指针&#xff0c;也就是内存的地址&#xff1b;所谓指针变量&#xff0c;也就是保存了内存地址的变量。关于指针的基本使用&#xff0c;在讲变量的时候做了…

d2-crud-plus 使用小技巧(四)—— 搜索限制只能输入数字

需求 搜索时有些字段需要限制&#xff0c;比如只能输入数字&#xff0c;不能存在其他字符包括空格。 效果 事情焦点后先触发校验&#xff0c;在触发查询。 代码 crud.js export const crudOptions (vm) > {return {columns: [{title: 号码,key: number,search: { //…

比Let‘s Encrypt更简单更齐全的免费证书申请教程

步骤一 打开JoySSL官网&#xff0c;注册属于你的专属账号&#xff1b; 永久免费SSL证书申请地址真正完全且永久免费&#xff01;不用您花一分钱&#xff0c;SSL证书免费使用90天&#xff0c;并且还支持连续签发。JoySSL携手全球权威可信顶级根&#xff0c;自研新一代SSL证书&…

【汇编】#3 8086与数据有关的寻址方式

文章目录 操作码与操作数1. 8086处理器的与数据有关的寻址方式1.1 立即数寻址方式1.2 寄存器寻址方式 2. 有效&#xff08;偏移&#xff09;地址&#xff08;effective address&#xff0c;EA&#xff09;与缺省段寄存器选择tips:段跨越前缀2.1 直接寻址tips:直接寻址与立即寻址…

GitOps实践之Argo CD (2)

argocd 【-1】argocd可以解决什么问题? helm 部署是手动的?依赖流水线。而有时候仅仅更新一个小东西,流水线跑好久,CD真的不应该和CI耦合。不同环境的helm配置不同,手动修改问题多,可以用git管理起来,例如分不同环境用目录区分。argocd创建应用可以不通环境部署到不同集…

Seata 2.x 系列【12】高可用集群部署

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 搭建演…

声卡喊话IP喇叭,IP网络吸顶天花喇叭

声卡喊话IP喇叭&#xff0c;IP网络吸顶天花喇叭 SV-7043VP是一款ip/sip网络吸顶喇叭&#xff0c;具有10/100M以太网接口&#xff0c;从网络接口接收网络的音频数据后播放。本网络吸顶喇叭可以与其他广播主机、服务器软件和采播主机配合使用&#xff0c;实现音频的播放&#xf…

大语言模型:Query Rewriting for Retrieval-Augmented Large Language Models

总体思路 作者首先指出大语言模型虽然取得了很好的效果&#xff0c;但是仍然存在幻觉和时间顺序混乱的问题&#xff0c;因此需要额外知识库和LLM内部知识库相结合&#xff0c;来修正&#xff1b;因此优化传统的retriever-reader的方案成为需要&#xff1b;目前的研究方案当中使…

log4cplus在Qt linux中的应用与问题解决

log4cplus在Qt linux中的应用与问题解决 背景log4cplus下载遇到问题&#xff1a;libm.so.6:undefined reference to __strtof128_nanGLIBC_PRIVATE‘解决方案编译生成在Qt工程里面添加对应依赖编译运行成功 背景 最近工作中需要用到log4cplus的日志做一些记录&#xff0c;用了…

Linux——ELK日志分析系统

实验环境 虚拟机三台CentOS 7.9&#xff0c; 组件包 elasticsearch-5.5.0.rpm elasticsearch-head.tar.gz node-v8.2.1.tar.gz phantomjs-2.1.1-linux-x86_64.tar.bz2 logstash-5.5.1.rpm kibana-5.5.1-x86_64.rpm 初始…

Lombok原理及实例(Java) - 简化JavaBean开发

Lombok 1.作用:简化javabean开发 2.使用:a.下插件 -> 如果是idea2022不用下载了,自带b.导lombok的jar包c.修改设置 1.lombok介绍 Lombok通过增加一些“处理程序”&#xff0c;可以让javabean变得简洁、快速。 Lombok能以注解形式来简化java代码&#xff0c;提高开发效…

优选算法[1]

目录 1.双指针&#xff1b; 2.滑动窗口&#xff1b; 3.二分查找&#xff1b; 4.前缀和&#xff1b; 1.双指针&#xff1b; 包括对撞指针和快慢指针(一般用来循环&#xff09;&#xff1b; 题目类型&#xff1a;移动零&#xff0c;复写零&#xff0c;快乐数&#xff0c;盛…

【UE5】动画混合空间的基本用法

项目资源文末百度网盘自取 什么是动画混合空间 混合空间分为两种: 通过一个数值控制通过两个数值控制 下面通过演示让大家更直观地了解 在Character文件夹中单击右键,选择动画(Animation),选择旧有的混合空间1D 然后选择骨骼&#xff08;动画是基于骨骼显示的,所以需要选择…

vue防止用户连续点击造成多次提交

中心思想&#xff1a;在第一次提交的结果返回前&#xff0c;将提交按钮禁用。 方法一&#xff1a;给提交按钮加上disabled属性&#xff0c;在请求时先把disabled属性改成true&#xff0c;在结果返回时改成false 方法二&#xff1a;添加loading遮罩层&#xff0c;可以直接使用e…

北京保险服务中心携手镜舟科技,助推新能源车险市场规范化

2022 年&#xff0c;一辆新能源汽车在泥泞的小路上不慎拖底&#xff0c;动力电池底壳受损&#xff0c;电池电量低。车主向保险公司报案&#xff0c;希望能够得到赔偿。然而&#xff0c;在定损过程中&#xff0c;保司发现这辆车的电池故障并非由拖底事件引起&#xff0c;而是由于…

EDM营销平台的核心功能?如何做精准营销?

EDM营销平台如何选择&#xff1f;怎么使用邮件营销平台优化发信&#xff1f; EDM营销平台以其独特的优势&#xff0c;成为了企业实现精准营销、提升品牌影响力的重要工具。那么&#xff0c;EDM营销平台究竟拥有哪些核心功能呢&#xff1f;接下来&#xff0c;AokSend就来一一探…

PyQt5---初识PyQt5相关及开发实战介绍

什么是GUI GUI是Graphical User Interface&#xff08;图形用户界面&#xff09;的缩写&#xff0c;是一种用户与计算机交互的方式&#xff0c;通过使用图形化的元素&#xff08;如按钮、窗口、菜单等&#xff09;来帮助用户完成任务。GUI使得用户可以通过鼠标、键盘等输入设备…

【C语言】整数存储、大小端概念

文章目录 整数存储大小端 整数存储 在计算机中&#xff0c;整数都是通过二进制保存的&#xff0c;不论是十六进制还是八进制还是十进制 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码 对于整形来说&#xff1a;数据存放内存中其实存放的是补码 在计算机系统中&…

LinuxU盘挂载原理,为什么要用到U盘挂载及实现U盘挂载

目录 一、U盘挂载原理 二、为什么要用到U盘挂载 三、实现U盘挂载 一、准备工作 1、安装gcc 2、下载ntfs-3g 3、解压 4、编译准备 5、编译并安装 二、挂载演示 一、U盘挂载原理 Linux的U盘挂载原理涉及以下几个方面&#xff1a; 设备识别&#xff1a;当您将U盘插入Lin…