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

一、线性表定义

线性表是一种数据结构,它是由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.mzph.cn/news/128159.shtml

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

相关文章

Redis(11)| 持久化AOF和RDB

一、AOF&#xff08;Append Only File&#xff09; Redis 每执行一条写操作命令&#xff0c;就把该命令以追加的方式写入到一个文件里&#xff0c;然后重启 Redis 的时候&#xff0c;先去读取这个文件里的命令&#xff0c;并且执行它。 注意&#xff1a;只会记录写操作命令&am…

微信小程序:两层循环的练习,两层循环显示循环图片大图(大图显示、多层循环)

效果 代码分析 外层循环 外层循环的框架 <view wx:for"{{info}}" wx:key"index"></view> wx:for"{{info}}"&#xff1a;这里wx:for指令用于指定要遍历的数据源&#xff0c;即info数组。当遍历开始时&#xff0c;会依次将数组中的每…

stable-diffusion 电商领域prompt测评集合

和GhostReivew一个思路&#xff0c;还是从比较好的图片或者是civitai上找一些热门的prompt&#xff0c;从小红书上也找到了不少的prompt&#xff0c;lexica.art上也有不少&#xff0c;主要是为了电商场景的一些测评&#xff1a; 小红书、civitai、Lexica、Liblib.ai、 depth o…

Leetcode—707.设计链表【中等】双链表的设计明天再写

2023每日刷题&#xff08;十七&#xff09; Leetcode—707.设计链表 设计单链表实现代码 typedef struct Node {int val;struct Node* next; } MyLinkedList;MyLinkedList* myLinkedListCreate() {MyLinkedList* mList (MyLinkedList *)malloc(sizeof(MyLinkedList));mList-&…

Wpf 使用 Prism 实战开发Day02

一.设计首页导航条 导航条的样式&#xff0c;主要是从Material DesignThemes UI 拷贝过来修改的,项目用了这个UI组件库&#xff0c;就看自己需要什么&#xff0c;就去拷过来使用&#xff0c;界面布局或其他组件使用&#xff0c;不做介绍。 直接下载源码&#xff0c;编译运行就可…

【进程控制⑥】:进程替换/exec*()系列接口

【进程控制⑥】&#xff1a;进程替换/ exec*(&#xff09;系列接口 一.进程替换原理二.替换特点1.独立性2.唯一性3.不变性4.不返回 三.程序替换应用【exec*系列系统调用】①execl&#xff1a;②execlp&#xff1a;③execv&#xff1a;④execle&#xff1a; 一.进程替换原理 我…

视频编码转换技巧:视频批量转码H264转H265,高效且顺畅

随着数字媒体的广泛应用&#xff0c;视频编码转换已成为一种普遍的需求。不同的视频格式和编码标准使得在不同设备上播放视频成为可能&#xff0c;同时也带来了兼容性和传输效率的问题。本文讲解引用云炫AI智剪使视频编码转换技巧&#xff0c;即批量将H264编码转换为H265编码&a…

厦门万宾科技智能井盖监测仪器的作用如何?

越来越多的人们希望改善生活&#xff0c;走出农村走出大山&#xff0c;前往城市之中居住。由此城市的人口和车辆在不断增加&#xff0c;与之而来的是城市的交通压力越来越大&#xff0c;时常会出现道路安全隐患&#xff0c;这给城市未来发展和智慧城市建设都带来一定的难题&…

sass相关

1、代码简化 1.1、简化媒介查询 mixin flex{display: flex;justify-content: center;align-items: center; } .header{width: 100%;include flex;//可以这样引用 }//加入参数 mixin flex($layout){display: flex;justify-content: $layout;align-items: $layout; } .header{w…

智慧矿山AI算法助力护帮板支护监测,提升安全与效率

在智慧矿山AI算法系列中&#xff0c;护帮板支护监测是保障矿山安全和提高生产效率的重要环节。护帮板作为矿山支护体系中的重要组成部分&#xff0c;在矿山生产中起到了关键的作用。那么&#xff0c;护帮板在哪种状态下是正常打开的呢&#xff1f;本文将对此进行介绍。 护帮板的…

Mgeo:multi-modalgeographic language model pre-training

文章目录 question5.1 Geographic Encoder5.1.1 Encoding5.1.2 5.2 multi-modal pre-training 7 conclusionGeo-Encoder: A Chunk-Argument Bi-Encoder Framework for Chinese Geographic Re-Rankingabs ERNIE-GeoL: A Geography-and-Language Pre-trained Model and its Appli…

QT6/5无痛安装和扩展,新手专用

QT6安装教程 注意在QT5.14.2以后版本只支持在线安装&#xff0c;所以如果需要离线exe版本&#xff0c;请安装5.14.2版本。这里是基于6.5版本Windows10的安装 如果觉得有用的话&#xff0c;请给个点赞收藏 1、安装链接 官方链接 qt官方链接&#xff1a;https://download.qt.io…

分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测

分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SMA-KELM黏菌优化算法优化核极限学习机分类预测(完整源码和数…

linux下df -h 命令一直卡住的解决方法

在Linux中&#xff0c;偶尔遇到用 df -h 查看磁盘情况时&#xff0c;一直卡住无法显示结果。 解决方法&#xff1a; 1、首先使用strace追踪到底执行到哪里卡住 $ strace df -h 2、如果没有strace命令则进行安装 $ yum install strace -y 3、显示出卡住的地方&#xff0c;如…

SaaS 出海,如何搭建国际化服务体系?(三)

防噎指南&#xff1a;这可能是你看到的干货含量最高的 SaaS 出海经验分享&#xff0c;请准备好水杯&#xff0c;放肆食用&#xff08;XD。 当越来越多中国 SaaS 企业选择开启「国际化」副本&#xff0c;出海便俨然成为国内 SaaS 的新角斗场。 LigaAI 观察到&#xff0c;出海浪…

Linux | 如何保持 SSH 会话处于活动状态

在远程服务器管理和安全数据传输中&#xff0c;SSH&#xff08;Secure Shell&#xff09;是不可或缺的工具。然而&#xff0c;它的便利性和安全性有时会因常见的问题而受到损害&#xff1a;冻结 SSH 会话。 此外&#xff0c;session 的突然中断可能会导致工作丢失、项目延迟和无…

软件测试/测试开发丨利用ChatGPT自动生成架构图

点此获取更多相关资料 简介 架构图通过图形化的表达方式&#xff0c;用于呈现系统、软件的结构、组件、关系和交互方式。一个明确的架构图可以更好地辅助业务分析、技术架构分析的工作。架构图的设计是一个有难度的任务&#xff0c;设计者必须要对业务、相关技术栈都非常清晰…

锐捷RG-EW1200G登录绕过漏洞复现

文章目录 锐捷RG-EW1200G登录绕过漏洞复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.复现 0x06 修复建议 锐捷RG-EW1200G登录绕过漏洞复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、…

为什么开设项目管理专栏

首先&#xff0c;向各位同道同行&#xff0c;分享一个来自博主的好消息&#xff1a; 2023年8月&#xff0c;经过一次为期3个月的紧张、有序、活泼、生动的学习之旅&#xff0c;博主顺利通过了PMP认证&#xff0c;并且拿下3A。 其次&#xff0c;为记录本次学习过程的点滴和心得…

从零开始的目标检测和关键点检测(一):用labelme标注数据集

从零开始的目标检测和关键点检测&#xff08;一&#xff09;&#xff1a;用labelme标注数据集 1、可视化标注结果2、划分数据集3、Lableme2COCO&#xff0c;将json文件转换为MS COCO格式 前言&#xff1a;前段时间用到了mmlab的mmdetction和mmpose&#xff0c;因此以一个小的数…