线性表操作的实现--顺序表

本文参考朱战力老师的数据结构与算法--使用C语言一书

文章目录

前言

一、线性表是什么?

二、具体实现

1.顺序表的定义

2.初始化ListInitiate(L)

3.求当前元素个数ListLength(L)

4.插入元素ListInsert(L,i,x)

5.删除元素ListDelete(L,i,x)

6.取元素ListGet(L,i,x)

7.小试牛刀

总结


前言

        本文所介绍的内容为数据结构与算法的基础内容--顺序表操作的实现,笔者通过不断的深入学习发现,后续的数据结构中,包括堆栈、队列、串、数组、表、数和二叉树无不是通过线性表去实现,故很好的理解线性表的操作对于广大的读者来说非常的有必要!


一、线性表是什么?

        线性表的抽象数据类型是线性表的逻辑结构,它表示线性表的元素、元素之间的逻辑关系以及线性表的操作集合。任何需要计算机进行管理和处理的元素都必须首先按照某种方式存储在计算机中。线性表有两种存储结构:一种是顺序存储结构,另一种是链式存储结构。一旦确定了线性表的存储结构,线性表操作集合中的所有操作就可以具体实现。

二、具体实现

1.顺序表的定义

代码如下(示例):

typedef struct {DataType list[MaxSize];int size;
}SeqList;

其中,DataType为数组元素的数据类型,MaxSize表示数组元素的最大个数,list表示顺序表的数组成员,size表示顺序表中当前存储的数组元素个数成员,且满足条件size<=MaxSize,SeqList是结构名。

2.初始化ListInitiate(L)

代码如下(示例):

void ListInitiate(SeqList* L) {L->size = 0;
}

说明:由于函数中要改变参数L的size域的值,因此参数L应设计为输出型参数,即参数L设计为SeqList的指针类型,否则,size域的修改值将不能带回去。

3.求当前元素个数ListLength(L)

代码如下(示例):

int ListLength(SeqList L) {return L.size;
}

4.插入元素ListInsert(L,i,x)

代码如下(示例):

int ListInsert(SeqList* L, int i, DataType x) {//在顺序表L的第i(0~size)个位置前插入x//插入成功返回1,插入失败返回0int j;if (L->size >= MaxSize) {printf("顺序表已满无法插入!\n");return 0;}else if (i<0 || i>L->size) {printf("参数i不合法!\n");return 0;}else {//从前向后依次后移数据,为插入做准备for (j = L->size; j > i; j--){L->list[j] = L->list[j - 1];}L->list[i] = x;        //插入xL->size++;            //元素个数加1return 1;}
}

此过程中,插入成功返回1,插入失败返回0.

顺序(步骤):

(1)判断条件:

1.判断顺序表是否已满

2.判断插入的位置是否合法

(2)操作过程:

3.进行移位操作(空出插入位置)

4.直接赋值(插入)

5.使元素个数+1

图示如下:

5.删除元素ListDelete(L,i,x)

代码如下(示例):

int ListDelete(SeqList* L, int i, DataType* x) {//删除顺序表L中第i(0~size-1)个位置处的元素并保存到x中//删除成功返回1,删除失败返回0int j;if (L->size <= 0) {printf("顺序表已空无元素可删!\n");return 0;}else if (i<0 || i>L->size - 1) {printf("参数i不合法");return 0;}else {*x = L->list[i];        //保存删除元素到x中//从前向后依次前移for (j = i + 1; j <= L->size - 1; j++){L->list[j - 1] = L->list[j];}L->size--;return 1;}
}

此过程中,删除成功返回1,删除失败返回0.

顺序(步骤):

(1)判断条件:

1.判断顺序表是否有元素可删

2.判断i是否合法

(2)操作过程:

3.使用变量x带走删除值

4.后续相应元素进行前移

5.使元素个数-1

图示如下:

6.取元素ListGet(L,i,x)

代码如下(示例):

int ListGet(SeqList L, int i, DataType* x) {//取顺序表L中第i个元素存于x中,成功返回1,失败返回0if (i<0 || i>L.size - 1) {printf("参数i不合法!\n");return 0;}else {*x = L.list[i];return 1;}
}

说明:取元素操作与删除元素操作类同,但更简单,取元素操作只需取元素list[i]到参数x中。

7.小试牛刀

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MaxSize 100
typedef struct Student {long number;    //学号数据项char name[10];    //姓名数据项char sex[3];    //性别数据项int age;        //年龄数据项
}StudentType;        //定义学生信息结构体typedef StudentType DataType;    //定义DataType
#include"SeqList.h" //包含顺序表头文件void main(void) {SeqList myList;int i;StudentType x[3] = { {2000001,"张三","男",20},{2000002,"李四","男",21},{2000003,"王五","女",22} };StudentType s;ListInitiate(&myList);    //初始化函数调用ListInsert(&myList, 0, x[0]);    //插入函数调用ListInsert(&myList, 1, x[1]);ListInsert(&myList, 2, x[2]);for (i = 0; i < ListLength(myList); i++) {    //当前元素个数函数调用ListGet(myList, i, &s);                    //取元素函数调用printf("%d    %s    %s    %d\n", s.number, s.name, s.sex, s.age);}
}

运行结果:


总结

        顺序表是一种基于顺序存储结构的数据结构,通过数组来表示元素的连续存储空间。顺序表具有快速访问任意位置的元素的优势,适用于对元素的随机访问较频繁的场景。

        在顺序表中,插入和删除元素的操作可能需要移动大量的元素,导致操作的时间复杂度较高。此外,顺序表的大小是固定的,一旦存储空间被占满,就无法再插入新的元素。

        总的来说,顺序表是一种简单而常见的数据结构,适用于需要快速访问元素和对存储空间连续性要求较高的场景。然而,需要注意在插入和删除操作频繁的情况下,可能会影响性能。

        通过顺序表,我们可以实现元素的插入、删除、查找等基本操作,并通过下标来快速定位元素。掌握顺序表的操作,对于理解和应用其他数据结构也具有重要的意义。

        通过使用顺序表,我们可以高效地组织和处理大量的数据,提高程序的运行效率和开发效率。要根据具体的需求选择合适的数据结构,以便在不同的场景中充分发挥其优势。

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

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

相关文章

Ubuntu deadsnakes 源安装新版 python

前言 适用于 Ubuntu 安装 python3.11 等新版本。 因为比较常用并且不想重新编译就记录一下&#xff0c;方便以后面向CV安装。 安装 添加 deadsnakes ppa 源 sudo add-apt-repository ppa:deadsnakes/ppa更新 apt sudo apt update安装 python3.11 sudo apt install python…

电子元器件管理系统 JAVA语言开发

目录 一、系统介绍 二、系统下载 三、系统截图 一、系统介绍 基于VueSpringBootMySQL的电子元器件管理系统包含元器件单位模块、元器件仓库模块、元器供应商模块、元器件品类模块、元器件明细模块、元器件采购模块、元器件采购审核模块、元器件领用模块、学生元器件申请模块…

【华为路由器】配置企业通过5G链路接入Internet示例

场景介绍 5G Cellular接口是路由器用来实现5G技术的物理接口&#xff0c;它为用户提供了企业级的无线广域网接入服务&#xff0c;主要用于eMBB场景。与LTE相比&#xff0c;5G系统可以为企业用户提供更大带宽的无线广域接入服务。 路由器的5G功能&#xff0c;可以实现企业分支…

KNN(K近邻)水仙花的分类(含答案)

题目 以下采用K-NN算法来解决水仙花的分类问题&#xff0c;每个样本有两个特征&#xff0c;第一个为水仙花的花萼长度&#xff0c;第二个为水仙花 的花萼宽度&#xff0c;具体数据见表&#xff0c; 1&#xff09;设置k3&#xff0c; 采用欧式距离&#xff0c;分析分类精度为多少…

【Linux系统编程:信号】产生信号 | 阻塞信号 | 处理信号 | 可重入函数

写在前面 通过学习信号可以理解进程与进程的一个相对关系&#xff0c;还能理解操作系统与进程的关系。要注意的是进程间通信中的信号量与这里的信号没有半毛钱关系&#xff0c;就像老婆和老婆饼。 本文要点&#xff1a; 掌握 Linux 信号的基本概念掌握信号产生的一般方式理解…

树与二叉树(考研版)

文章目录 树与二叉树树的基本概念结点、树属性的描述树的性质 二叉树的概念二叉树的性质二叉树的构建二叉树的遍历先序遍历中序遍历后序遍历层次遍历 递归算法和非递归算法的转换源代码 线索二叉树二叉树的线索化线索二叉树 找前驱/后继 树和森林树的存储 树与二叉树的应用哈夫…

JavaScript快捷方式:15个简写技巧,让你的代码事半功倍!

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

依靠继承与聚合,实现maven搭建分布式项目

简介聚合 对于复杂的Maven项目&#xff0c;一般建议采用多模块的方式来设计开发&#xff0c;便于后期维护管理。但是构建项目时&#xff0c;如果每次都需要按模块一个一个进行构建会十分麻烦&#xff0c;而Maven的聚合功能就可以很好的解决这个问题&#xff0c;当用户对聚合模…

Ubuntu22.04安装,SSH无法连接

Ubuntu初始化安装后&#xff0c;系统默认不允许root通过ssh连接&#xff0c;因此需要完成三个设置 1.修改ssh配置文件 vim /etc/ssh/sshd_config 将PermitRootLogin注释打开&#xff0c;并将值改为yes 保存修改并退出 :wq 2.重启ssh服务 sudo service ssh restart 3.重新打…

UG\NX二次开发 设置视图中心 UF_VIEW_set_center

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 a1794902437 订阅本专栏,非常感谢。 简介 UG\NX二次开发 设置视图中心 UF_VIEW_set_center。如果视图NULL_TAG,则使用工作视图。 效果 代码 #include &qu…

Android12 启动页适配

印象中&#xff0c;在2022年末接到了一个针对Android12启动页适配的需求&#xff0c;当时也使用了一些适配方案&#xff0c;也写了一个Demo&#xff0c;但是最终没有付诸适配行动&#xff1b;当然并不是适配失败&#xff0c;而是根据官方适配方案适配后太丑了… 1024纪念文章&a…

SpringBoot整合Activiti7——任务监听器(七)

文章目录 一、任务监听器事件类型配置方式(选)代码实现xml文件创建监听器class方式expression方式delegateExpression 测试流程部署流程启动流程完成任务 一、任务监听器 任务监听器可以在任务创建、任务分配、任务完成、任务删除发生时触发&#xff0c;从而执行相应的逻辑。 事…

【微服务保护】初识 Sentinel —— 探索微服务雪崩问题的解决方案,Sentinel 的安装部署以及将 Sentinel 集成到微服务项目

文章目录 前言一、雪崩问题及其解决方案1.1 什么是雪崩问题1.2 雪崩问题的原因1.3 解决雪崩问题的方法1.4 总结 二、初识 Sentinel 框架2.1 什么是 Sentinel2.2 Sentinel 和 Hystrix 的对比 三、Sentinel 的安装部署四、集成 Sentinel 到微服务 前言 微服务架构在现代软件开发…

【Kotlin精简】第6章 反射

1 反射简介 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff0c;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性。 1.1 Kotlin反射 我们对比Kotlin和Java的反射类图。 1.1.1 Kotlin反射常用的数据结…

Unity Profiler 详细解析(一)

Overview: . Profiler简介 . Profiler各模块介绍 . 各平台下Profiler的使用 . 基于Profiler的优化定位 . Profiler的主要参数详解 . Profiler案例 Profiler简介 Profiler 是Unity中分析性能开销的工具 • 各种开销一览无遗 • 可跨平台使用&#xff08;Web、PC、iOS、Android、…

模拟 Junit 框架

需求 定义若干个方法&#xff0c;只要加了MyTest注解&#xff0c;就可以在启动时被触发执行 分析 定义一个自定义注解MyTest&#xff0c;只能注解方法&#xff0c;存活范围是一直都在定义若干个方法&#xff0c;只要有MyTest注解的方法就能在启动时被触发执行&#xff0c;没有这…

侯捷C++面向对象程序设计笔记(上)-Object Based(基于对象)部分

基于对象就是对于单一class的设计。 对于有指针的&#xff1a;complex.h complex-test.cpp 对于没有指针的&#xff1a; string.h string-test.cpp https://blog.csdn.net/ncepu_Chen/article/details/113843775?spm1001.2014.3001.5501#commentBox 没有指针成员——以复数co…

计算机网络,网络(OSI)七层模型,三次握手四次挥手,get与post请求区别,网络IO(BIO\NIO\AIO),TCP与UDP区别

1.OSI模型&#xff1f; 开放式系统互联通信参考模型(Open System Interconnection Reference Model) OSI网络七层模型&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP协议群简化了OSI七层模型&#xff1a;应用层、传输层、网络层、数据链路…

Ubuntu 安装 npm 和 node

前言 最近学习VUE&#xff0c;在ubuntu 2204 上配置开发环境&#xff0c;涉及到npm node nodejs vue-Cli脚手架等内容&#xff0c;做以记录。 一、node nodejs npm nvm 区别 &#xff1f; node 是框架&#xff0c;类似python的解释器。nodejs 是编程语言&#xff0c;是js语言的…

DDOS直接攻击系统资源

DDOS ——直接攻击系统资源 思路&#xff1a; 攻击机利用三次握手机制&#xff0c;产生大量半连接&#xff0c;挤占受害者系统资源&#xff0c;使其无法正常提供服务。 1、先体验下受害者的正常网速。在受害者主机上执行以下命令 (1)开启Apache。 systemctl start apache2 (2…