数据结构——线性表①(顺序表)

一、线性表定义

线性表是一种数据结构,它是由n个具有相同数据类型的数据元素a1,a2,…,an组成的有限序列

其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。

线性表可以用顺序存储结构链式存储结构来实现。

  • 顺序表是一种用一段地址连续的存储单元依次存储线性表中的数据元素的存储结构;
  • 链表则是一种用一组任意的存储单元存储线性表中的数据元素的存储结构。

【线性表内容框架】
在这里插入图片描述

二、线性表特点

  • 表中数据元素的个数有限
  • 表中元素具有逻辑上的顺序性,表中元素有其先后次序
  • 表中元素都是数据元素,每个元素都是单个元素
  • 表中的元素数据类型都相同,即每个元素都占有相同大小的存储空间
  • 表中元素具有抽象性,即仅讨论元素之间的逻辑关系,而不考虑元素究竟表示什么内容

三、线性表的基本操作

  • InitList(&L):初始化表。构造一个空的线性表L,分配内存空间。
  • DestroyList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间。
  • ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。
  • ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
  • LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。
  • GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。

【其他操作】

  • Length(L):求表长。返回线性表L的长度,即L中数据元素的个数
  • PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
  • Empty(L):判空操作。若L为空表,则返回true,否则迟回false 。

注意
上面写的函数严格来说并不正确,因为没有写返回值类型
其次,函数的参数有带符号“&”的,这是C++的语法,和C语言中的指针效果一致
比如说初始化表的函数,用C语言的写法,也可以写成 InitList(<类型名>* L);
要初始化一个数据元素类型为整型的线性表的话,初始化函数可以写成 InitList(int* L);

四、线性表的分类

(1)顺序表

1.1 顺序表的定义

线性表的顺序存储叫做顺序表。(用顺序存储的方式实现线性表)

顺序存储——把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。需要开辟一段了连续的空间用来存储数据。

在这里插入图片描述

1.2 顺序表的创建和初始化及相关操作

这里插一句,顺序表有两种,一种是动态顺序表,一种是静态顺序表
·静态顺序表使用定长数组存储元素
·而动态顺序表可以动态开辟内存,可以动态改变数组长度

静态顺序表的创建和初始化比较简单,
在这里插入图片描述
静态顺序表的创建就是直接在main函数中创建一个SqList 类型的结构体变量
静态顺序表的初始化就是把 链表结构体中的 length 的值设置为0

静态顺序表的基本操作:添加元素(插入元素)、删除元素、修改元素、查找元素

代码如下:

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>#define MaxSize 10 //这里宏定义了静态顺序表最多能存储10个数据struct SqList
{int data[MaxSize];int length;
};
typedef struct SqList SqList;void InitList(SqList* list)//初始化静态顺序表
{list->length = 0;
}int ListInsert(SqList* L, int i, int e)//在表中位置i处,插入数据e
{if (i < 1 || i > L->length + 1 || L->length >= MaxSize) {return 0;}for (int j = L->length; j >= i; j--) {L->data[j] = L->data[j - 1];}L->data[i - 1] = e;L->length++;return 1;
}int ListDelete(SqList* L, int i) //删除表中位序为i的数据元素
{if (i < 1 || i > L->length){return 0;}for (int j = i; j < L->length; j++){L->data[j - 1] = L->data[j];}L->length--;return 1;
}void PrintList(SqList list)//打印顺序表中所有元素
{for (int i = 0; i < list.length; i++){printf("%d ", list.data[i]);}
}int Find(SqList list,int e)//查找顺序表中值为e 的元素,返回其位序,如果没找到,返回0
{if (list.length == 0){return 0;}for (int i = 0; i < list.length; i++){if (list.data[i] == e){return i + 1;}}return 0;
}int Change(SqList* list,int i,int e)//修改位序为i处的数据,把数据改成e
{if (i < 1 || i > list->length + 1 || list->length >= MaxSize) {return 0;}list->data[i-1] = e;return 1;
}
#include"SqList.h"int main() 
{SqList L;InitList(&L);ListInsert(&L, 1, 10);//在位序1处插入数字10ListInsert(&L, 2, 20);//在位序2处插入数字20ListInsert(&L, 3, 30);//在位序3处插入数字30PrintList(L);//打印静态顺序表中的所有数据printf("\n");ListDelete(&L, 2);//删除静态顺序表中位序为2的数据(删除20)PrintList(L);printf("\n");int pos1 = Find(L, 20);printf("%d\n", pos1);//0int pos2 = Find(L, 30);printf("%d\n", pos2);//2Change(&L,1,24);PrintList(L);//24 30return 0;
}

在这里插入图片描述


动态顺序表的创建和初始化

#define InitSize 10  //顺序表的初始长度
typedef struct
{ElemType *data; //指示动态分配数组的指针int MaxSize;    //顺序表的最大容量int length;     //顺序表的当前长度
}seqList;
//顺序表的类型定义(动态顺序表)

动态顺序表的好处是可以在容量不够的情况下进行扩容操作
动态顺序表的创建:在main函数中创建一个结构体变量
动态顺序表的初始化:用malloc开辟一段连续空间;初始化最大容量为宏定义的初始化长度;令顺序表的当前长度为0

动态顺序表的增删改查的函数操作实现

代码如下

#define InitSize 10  //顺序表的初始长度  
typedef int ElemType;
typedef struct seqList
{ElemType* data; //动态分配数组的指针  int MaxSize;    //顺序表的最大容量  int length;     //顺序表的当前长度  
} seqList;void InitList(seqList* L)//动态顺序表的初始化
{L->data = (int*)malloc(InitSize * sizeof(int));//用malloc函数申请一片连续的存储空间L->length = 0;L->MaxSize = InitSize;
}//增加动态数组的长度
void Increasesize(seqList* L, int len)
{int* p = L->data;L->data = (int*)malloc((L->MaxSize + len) * sizeof(int));for (int i = 0; i < L->length; i++){L->data[i] = p[i];}L->MaxSize = L->MaxSize + len; free(p);
}// 插入元素  
int InsertList(seqList* L, int index, ElemType elem) {if (index < 0 || index > L->length || L->length == L->MaxSize) {return 0; // index error 或 溢出  }for (int i = L->length; i >= index; i--) {L->data[i + 1] = L->data[i]; // 后移一位  }L->data[index] = elem; // 插入新元素  L->length++; // 长度加一  return 1; // 插入成功  
}// 删除元素  
int DeleteList(seqList* L, int index) {if (index < 0 || index >= L->length) {return 0; // index error  }for (int i = index; i < L->length - 1; i++) {L->data[i] = L->data[i + 1]; // 前移一位  }L->length--; // 长度减一  return 1; // 删除成功  
}// 查找元素,返回元素位置,未找到返回-1  
int FindList(seqList* L, ElemType elem) {for (int i = 0; i < L->length; i++) {if (L->data[i] == elem) {return i; // 找到元素,返回位置  }}return -1; // 未找到元素,返回-1  
}// 修改元素,返回修改结果,未找到返回-1  
int UpdateList(seqList* L, int index, ElemType elem) {if (index < 0 || index >= L->length) {return 0; // index error  }L->data[index] = elem; // 修改元素值  return 1; // 修改成功,返回1  
}

1.3 顺序表的特点

①随机访问,即可以在O(1)时间内找到第i个元素。
②存储密度高,每个节点只存储数据元素
③拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
④插入、删除操作不方便,需要移动大量元素

1.4顺序表的应用场景

顺序表适用于需要随机访问元素的场景,例如需要快速查找某个元素的位置或者根据下标进行访问。

以下是顺序表的一些应用场景举例:

  • 数组:数组是一种顺序表的实现方式,适用于需要快速访问元素的场景,例如存储图像、音频等数据。
  • 数据库:数据库中的表可以使用顺序表来实现,例如需要根据主键快速查找某个记录。
  • 缓存:缓存中的数据可以使用顺序表来实现,例如需要快速查找某个缓存项。
  • 索引:索引可以使用顺序表来实现,例如需要快速查找某个关键字对应的记录。
  • 排序:排序算法中的一些算法可以使用顺序表来实现,例如冒泡排序、快速排序等。

~~更多 线性表相关知识 欢迎浏览下一篇文章《数据结构——线性表②》

在这里插入图片描述

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

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

相关文章

云原生-AWS EC2使用、安全性及国内厂商对比

目录 什么是EC2启动一个EC2实例连接一个实例控制台ssh Security groups规则默认安全组与自定义安全组 安全性操作系统安全密钥泄漏部署应用安全元数据造成SSRF漏洞出现时敏感信息泄漏网络设置错误 厂商对比参考 本文通过实操&#xff0c;介绍了EC2的基本使用&#xff0c;并在功…

关于ABB 机器人多任务的建立

关于ABB 机器人多任务的建立.需要实时监控某一区域&#xff0c;或者某一信号&#xff0c;或者计件到达某一数量机器人自动停止报警&#xff0c;显示到示教器上&#xff0c;多任务可以实现&#xff0c;类似发那科机器人后台逻辑指令 当软件选项漏选或者少选可以选择修改选项&…

近期面试小结

作者&#xff1a;究极逮虾户 最近面试了不少的公司&#xff0c;行情整体来说还是非常差的&#xff0c;如果没有必要不建议大家裸辞&#xff0c;另外就不总结面试的题目了。这次打算着重从项目经验上来给大家讨论下&#xff0c;我觉得这部分可能才是面试中得分比重比较大的部分&…

C的缺陷和陷阱读书笔记

词法陷阱 1、if语句的特殊用法 1、if(x>max) maxx;2、if(x>max?x;max) //条件表达式&#xff0c;是执行第二个&#xff0c;否执行第三个3、if(x>max); //条件成立后执行——空语句4、if((fopen(arg v[i],0))>0) //open函数执行&#xff0c;成功返回后面的0&a…

处理大数据的基础架构,OLTP和OLAP的区别,数据库与Hadoop、Spark、Hive和Flink大数据技术

处理大数据的基础架构&#xff0c;OLTP和OLAP的区别&#xff0c;数据库与Hadoop、Spark、Hive和Flink大数据技术 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&am…

前端的简单介绍

前端核心的分析 CSS语法不够强大&#xff0c;比如无法嵌套书写&#xff0c;倒是模块化开发中需要书写很多重复的选择器 没有变量和合理的样式复用机制&#xff0c;使逻辑上相关的属性值必须字面量的心事重复的输出&#xff0c;导致难以维护 CSS预处理器,减少代码的笨重&#…

DNS 域名解析系统

文章目录 前言什么是 DNS 域名解析系统为什么需要 DNS 域名解析DNS 是如何发展的hosts 文件维护域名和IP的映射关系DNS 系统&#xff08;服务器&#xff09;DNS 镜像系统 前言 前面为大家分享了关于计算机网络中应用层——自定义协议、传输层——UDP、TCP 协议、网络层——IP协…

pgsql 分组查询,每组取10条

需求&#xff1a; 按照表的字段分组&#xff0c;然后每组取10条结果&#xff0c;返回即可 sql 如下&#xff1a; SELECT* FROM (SELECT chk_id,feature_id,task_id, ROW_NUMBER () OVER (PARTITION BY chk_id ORDER BY chk_id) AS row_num FROM ics_check_report WHERE task…

肺癌不再是老年病:33岁作家的离世引发关注,有这些情况的请注意

近期&#xff0c;90后网络小说家七月新番和26岁男艺人蒋某某因肺癌去世&#xff0c;引发关注。他们都没有吸烟习惯&#xff0c;那么他们为什么会得肺癌呢&#xff1f;浙大二院呼吸内科副主任医师兰芬说&#xff0c;现在年轻人熬夜、加班导致身体过劳&#xff0c;在劳累情况下身…

Vue Router使用VueUse更改标签页名称的工具函数

进入正题 安装 npm i vueuse/core or pnpm i vueuse/core or yarn add vueuse/corerouter/helper.js import { useTitle } from vueuse/coreexport const usePageTitle (to) > {const projectTitle import.meta.env.VITE_APP_TITLE // 将可变名抽出到 .env 内配置cons…

element-plus走马灯不显示

问题描述 依赖正确&#xff0c;代码用法正确&#xff0c;但是element-plu走马灯就是不显示&#xff01;&#xff01; <div class"content"><el-carousel height"150px" width"200px"><el-carousel-item v-for"item in 4&qu…

Windows详细安装和彻底删除RabbitMQ图文流程

RabbiitMQ简介 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff1a;Advanced Message Queue Protocol&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而聚类和故障转移是构建在开放…

基于springboot框架的房屋租赁租房系统

功能如图所示 摘要 房屋租赁租房系统是一个基于Spring Boot框架开发的全新房地产管理平台&#xff0c;它旨在简化租房流程&#xff0c;提供房东和租户之间的高效互动&#xff0c;以满足现代社会对房屋租赁的不断增长的需求。该系统充分利用了Spring Boot的强大特性&#xff0c;…

arcpy.describe

描述 根据输入的数据&#xff0c;返回输入数据的属性 arcpy.da.Describe与arcpy.Describe返回的数据是一样的但是返回的的类型不一样&#xff0c;arcpy.da.Describe返回的是字典&#xff0c;arcpy.Describe返回的是string 如果要访问数据对象不存在的属性&#xff0c;将返回…

Yolo-Z:改进的YOLOv5用于小目标检测

目录 一、前言 二、背景 三、新思路 四、实验分析 论文地址&#xff1a;2112.11798.pdf (arxiv.org) 一、前言 随着自动驾驶汽车和自动驾驶赛车越来越受欢迎&#xff0c;对更快、更准确的检测器的需求也在增加。 虽然我们的肉眼几乎可以立即提取上下文信息&#xff0c;即…

美国人工智能政策公布

美国总统拜登 30 号上午发布了一项关于人工智能&#xff08;AI&#xff09;的行政命令&#xff08;EO&#xff09;。该行政命令最初以白宫情况说明书的形式向公众提供&#xff0c;“为人工智能安全和安保制定了新标准&#xff0c;保护美国人的隐私&#xff0c;促进公平和公民权…

【Linux】开发工具——vim多模式编辑器的入土设置sudoers白名单

个人主页点击直达&#xff1a;小白不是程序媛 Linux系列专栏&#xff1a;Linux被操作记 目录 前言&#xff1a; 基本概念 vim基本操作 [正常模式]切换至[插入模式] [插入模式]切换至[正常模式] [正常模式]切换至[末行模式] 三种模式的切换关系图 vim命令模式命令集 进…

骨传导耳机到底好用吗,到底骨传导耳机是不是噱头呢?

随着社会的飞速发展以及科技的不断提升&#xff0c;人们对健康的关注度也逐渐提高起来。而在这种背景下&#xff0c;骨传导耳机以其独特不可替代的优势&#xff0c;吸引了一大群骨传导爱好者的目光。 那么骨传导耳机是不是噱头呢&#xff1f;其实这种耳机不仅不会堵塞耳道&…

什么是接口自动化测试?接口自动化测试的目的是什么?

1、什么是接口测试 接口测试是对系统或组件之间的接口的测试。主要用于检测外部系统与系统间以及内部各个子系统间的交互点。测试重点是检查数据交换、传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 2、接口测试的目的 1> 尽早介入软件测试流程&#…

【23真题】邮电之首!扩招15倍!专业课难度骤降!

今天分享的是23年北京邮电大学804的信号与系统试题及解析。 本套试卷难度分析&#xff1a;北邮804在22年只招生6人&#xff0c;23年拟招生87人&#xff0c;扩招近15倍&#xff01;22年北京邮电大学804考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自…