嵌入式学习——数据结构——顺序表

线性表的定义

  • 线性表是零个或多个数据元素的有限序列,元素之间具有顺序性,如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有一个前驱和一个后继。线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。在非空的表中每个元素都有一个确定的位置,如果a1是第一个元素,那么an就是第n个元素。

线性表的常规操作

  • 创建SeqList *CreateSeqList(int len)用于创建一个指定长度的线性表,分配相应的内存空间。
  • 销毁int DestroySeqList(SeqList *list)释放线性表所占用的内存,防止内存泄漏。
  • 展示int ShowSeqList(SeqList *list)可以将线性表中的元素信息展示出来,方便查看数据。
  • 尾部插入int InsertTailSeqList(SeqList *list, DATATYPE data)在表的尾部添加新元素,实现数据的扩充。
  • 判断是否已满int IsFullSeqList(SeqList *list)检查线性表是否已经达到存储上限。
  • 判断是否为空int IsEmptySeqList(SeqList *list)用于判断线性表是否为空表。
  • 指定位置插入int InsertPosSeqList(SeqList *list, DATATYPE data, int pos)可以在指定位置插入元素,需要移动插入位置后的元素。
  • 查找int FindSeqList(SeqList *list, char *name)根据元素的某个特征(如姓名)在线性表中查找元素的位置。
  • 修改int ModifySeqList(SeqList *list, char *old, DATATYPE new)根据特定条件(如旧的元素值)修改线性表中的元素。
  • 删除int DeleteSeqList(SeqList *list, char *name)根据元素特征(如姓名)删除相应的元素,删除后也需要移动元素来填补空缺。
  • 清空int ClearSeqList(SeqList *list)将线性表中的所有元素删除,使线性表变为空表。

线性表顺序存储的优缺点

  • 优点
    • 无需额外存储逻辑关系:因为数据元素在物理上是连续存储的,其顺序就体现了逻辑关系,不需要额外的空间来存储元素之间的逻辑关系,节省了存储空间。
    • 快速随机访问:可以直接通过数组下标在常数时间O(1)内访问任意位置的元素。例如,对于SeqList线性表,要访问第i个元素,可以直接通过list->head[i]来获取,不需要逐个元素遍历。
  • 缺点
    • 插入和删除操作复杂:当需要插入或删除一个元素时,需要移动插入或删除位置之后的所有元素。例如,在一个长度为n的线性表中,在第i个位置插入一个元素,需要将第i个及之后的元素都向后移动一位,平均需要移动n/2个元素,时间复杂度为O(n)
    • 无法动态存储:在创建线性表时需要预先指定其长度,在运行过程中不能根据实际需要动态地增加或减少存储空间。如果一开始估计的长度过小,可能导致数据无法全部存储;如果估计的长度过大,则会浪费存储空间。

 代码示例

seqlist.h

#ifndef SEQLIST_H
#define SEQLIST_H// 定义一个名为 person 的结构体来存储人员信息
typedef struct person {char name[32];    // 姓名char gender;      // 性别int age;          // 年龄int score;        // 分数
}DATATYPE;// 定义一个名为 list 的结构体来表示顺序表
typedef struct list {DATATYPE *head;   // 指向存储数据元素的数组的指针int tlen;         // 顺序表的总长度int clen;         // 当前顺序表中元素的个数
}SeqList;// 创建一个指定长度的顺序表
SeqList *CreateSeqList(int len);
// 销毁顺序表,释放相关内存
int DestroySeqList(SeqList *list);
// 展示顺序表中的所有元素信息
int ShowSeqList(SeqList *list);
// 在顺序表的尾部插入一个元素
int InsertTailSeqList(SeqList *list, DATATYPE *data);
// 判断顺序表是否已满
int IsFullSeqList(SeqList *list);
// 判断顺序表是否为空
int IsEmptySeqList(SeqList *list);
// 在顺序表的指定位置插入一个元素
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos);
// 根据姓名查找元素在顺序表中的位置
int FindSeqList(SeqList *list, char *name);
// 根据旧元素的值修改为新元素的值
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata);
// 根据姓名删除顺序表中的元素
int DeleteSeqList(SeqList *list, char *name);
// 清空顺序表中的所有元素
int ClearSeqList(SeqList *list);
// 获取顺序表中元素的个数
int GetSizeSeqList(SeqList *list);
// 获取顺序表中指定位置的元素
DATATYPE* GetItemSeqList(SeqList *list, int pos);#endif // SEQLIST_H

seqlist.c

#include "seqlist.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>// 创建一个长度为 len 的顺序表
SeqList *CreateSeqList(int len)
{// 为 SeqList 结构体分配内存空间SeqList* sl = malloc(sizeof(SeqList));if(NULL == sl){// 如果内存分配失败,输出错误信息perror("CreateSeqList malloc");return NULL;}// 为存储数据元素的数组分配内存空间sl->head = malloc(sizeof(DATATYPE)*len);if(NULL == sl->head){perror("CreateSeqList malloc2");// 如果内存分配失败,释放之前为 SeqList 结构体分配的内存free(sl);return NULL;}// 初始化当前元素个数为 0,总长度为指定长度sl->clen = 0;sl->tlen = len;return sl;
}// 销毁顺序表,释放内存
int DestroySeqList(SeqList *list)
{// 先释放存储数据元素的数组的内存free(list->head);// 再释放 SeqList 结构体的内存free(list);return 0;
}// 在顺序表的尾部插入一个元素
int InsertTailSeqList(SeqList *list, DATATYPE *data)
{// 如果顺序表已满,则输出提示信息并返回 1if(IsFullSeqList(list)){printf("list is full\n");return 1;}// 将数据元素复制到顺序表的尾部memcpy(&list->head[list->clen],data,sizeof(DATATYPE));// 当前元素个数加 1list->clen++;return 0;
}// 判断顺序表是否已满
int IsFullSeqList(SeqList *list)
{// 如果当前元素个数等于总长度,则表示顺序表已满return list->clen == list->tlen;
}// 判断顺序表是否为空
int IsEmptySeqList(SeqList *list)
{// 如果当前元素个数为 0,则表示顺序表为空return 0 == list->clen;
}// 展示顺序表中的所有元素信息
int ShowSeqList(SeqList *list)
{int i = 0 ;int len = GetSizeSeqList(list);for(i=0;i<len;i++){// 输出每个元素的姓名、性别、年龄和分数printf("name:%s gender:%c age:%d score:%d\n",list->head[i].name,list->head[i].gender,list->head[i].age,list->head[i].score);}return 0;
}// 获取顺序表中元素的个数
int GetSizeSeqList(SeqList *list)
{return list->clen;
}// 根据姓名查找元素在顺序表中的位置
int FindSeqList(SeqList *list, char *name)
{int i = 0 ;int len = GetSizeSeqList(list);for(i =0 ;i<len;i++){// 比较姓名是否相等,如果相等则返回当前位置if(0==strcmp(list->head[i].name,name)){return i;}}// 如果没有找到匹配的姓名,则返回 -1return -1;
}// 获取顺序表中指定位置的元素
DATATYPE *GetItemSeqList(SeqList *list, int pos)
{int len = GetSizeSeqList(list);// 如果位置不合法,则返回 NULLif(pos<0||pos>=len){return NULL;}// 返回指定位置的元素的指针return &list->head[pos];
}// 根据旧元素的值修改为新元素的值
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata)
{int ret = FindSeqList(list,old);// 如果没有找到旧元素,则返回 1if(-1 == ret){return 1;}// 将新元素复制到找到的旧元素的位置memcpy(&list->head[ret],newdata,sizeof(DATATYPE));return 0;
}// 在指定位置插入一个元素
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
{int len = GetSizeSeqList(list);// 如果位置不合法,则返回 1if(pos<0||pos>len){return 1;}// 将插入位置及之后的元素向后移动一位for(int i=list->clen;i!=pos ;i--){list->head[i]= list->head[i-1];}// 将新元素插入到指定位置memcpy(&list->head[pos],data,sizeof(DATATYPE));// 当前元素个数加 1list->clen++;return 0;
}// 清空顺序表中的所有元素
int ClearSeqList(SeqList *list)
{// 将当前元素个数置为 0list->clen=0;return 0;
}// 根据姓名删除顺序表中的元素
int DeleteSeqList(SeqList *list, char *name)
{int ret = FindSeqList(list,name);if(-1 == ret){// 如果没有找到要删除的元素,则输出提示信息并返回 1printf("can't find %s\n",name);return 1;}// 将删除位置之后的元素向前移动一位for(int i=ret; i!=list->clen; i++){list->head[i] = list->head[i+1];}// 当前元素个数减 1list->clen--;return 0;
}

main.c

#include <stdio.h>
#include "seqlist.h"int main()
{// 定义一个包含人员信息的数组DATATYPE data[]={{"zhangsan",'m',20,80},{"lisi",'f',21,82},{"wangmazi",'f',22,70},{"lao6",'f',30,70},{"zhaosi",'f',30,50},};// 创建一个长度为 10 的顺序表SeqList*sl=  CreateSeqList(10);// 向顺序表尾部插入三个元素InsertTailSeqList(sl,&data[0]);InsertTailSeqList(sl,&data[1]);InsertTailSeqList(sl,&data[2]);// 展示顺序表中的所有元素信息ShowSeqList(sl);printf("--------find----------\n");char want_name[50]="li2si";// 在线性表中查找指定姓名的元素的位置int ret = FindSeqList(sl,want_name);if(-1 == ret){printf("can't find %s\n",want_name);}else{// 获取查找到的元素的指针并输出其信息DATATYPE* find_data = GetItemSeqList(sl,ret);printf("name:%s score:%d\n",find_data->name,find_data->score);}printf("--------modify----------\n");// 修改顺序表中指定姓名的元素的值ModifySeqList(sl,"lisi",&data[3]);ShowSeqList(sl);printf("--------ins pos----------\n");// 在指定位置插入一个元素InsertPosSeqList(sl,&data[4],2);ShowSeqList(sl);printf("--------delete----------\n");// 根据姓名删除顺序表中的元素DeleteSeqList(sl,"zhangsan");ShowSeqList(sl);// 销毁顺序表,释放内存DestroySeqList(sl);printf("Hello World!\n");return 0;
}

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

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

相关文章

【网络安全】-rce漏洞-pikachu

rce漏洞包含命令执行漏洞与代码执行漏洞 文章目录 前言 什么是rce漏洞&#xff1f; 1.rce漏洞产生原因&#xff1a; 2.rce的分类&#xff1a; 命令执行漏洞&#xff1a; 命令拼接符&#xff1a; 常用函数&#xff1a; 代码执行漏洞&#xff1a; 常用函数&#xff1a; 分类&…

信号与线性系统综合实验

文章目录 一、实验目的二、实验内容及其结果分析&#xff08;一&#xff09;基础部分&#xff08;二&#xff09;拓展部分&#xff08;三&#xff09;应用设计部分 三、心得体会 一、实验目的 1、掌握连续时间信号与系统的时域、频域综合分析方法&#xff1b;   2、掌握运用M…

SAP B1 单据页面自定义 - 用户界面编辑字段

背景 接《SAP B1 基础实操 - 用户定义字段 (UDF)》&#xff0c;在设置完自定义字段后&#xff0c;如下图&#xff0c;通过打开【用户定义字段】可打开表单右侧的自定义字段页。然而再开打一页附加页面操作繁复&#xff0c;若是客户常用的定义字段&#xff0c;也可以把这些用户…

JMM 指令重排 volatile happens-before

在单线程程序中&#xff0c;操作系统会通过编译器优化重排序、指令级并行重排序、内存系统重排序三个步骤对源代码进行指令重排&#xff0c;提高代码执行的性能。 但是在多线程情况下&#xff0c;操作系统“盲目” 地进行指令重排可能会导致我们不想看到的问题&#xff0c;如经…

2024第三届大学生算法大赛 真题训练2 解题报告 | 珂学家 | FFT/NTT板子

前言 题解 D是FFT板子题&#xff0c;这么来看&#xff0c;其实处于ACM入门题&#xff0c;哭了T_T. D. 行走之谜 思路: FFT 如果你知道多项式乘法&#xff0c;继而知道FFT&#xff0c;那题纯粹就是板子题&#xff0c;可惜当时比赛的时候&#xff0c;无人AC。 这题来简单抽象…

物联网之PWM呼吸灯、脉冲、LEDC

MENU 前言原理硬件电路设计软件程序设计analogWrite()函数实现呼吸灯效果LEDC输出PWM信号 前言 学习制作呼吸灯&#xff0c;通过LED灯的亮度变化来验证PWM不同电压的输出。呼吸灯是指灯光在单片机的控制之下完成由亮到暗的逐渐变化&#xff0c;感觉好像是人在呼吸。 原理 脉冲宽…

【中秋月饼系列】2024年立体月饼新鲜出炉----python画月饼(1)附完整代码

【中秋月饼系列】2024年立体月饼新鲜出炉 ----python画月饼&#xff08;1&#xff09;附完整代码 本文目录&#xff1a; 零、时光宝盒 一、2024年中秋节立体逼真月饼&#xff08;效果展示&#xff09; 二、Python 海龟画图主要方法 &#xff08;1&#xff09;海龟画图的主…

学习大数据DAY56 业务理解和第一次接入

作业1 1 了解行业名词 ERP CRM OA MES WMS RPA SAAS 了解每个系统的功能和应用 ERP 系统&#xff0c;&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划系统&#xff09;&#xff1a;ERP 系统 是一种用于管理企业各类资源的软件系统&#xff0c;包括生产管理…

攻防世界 ics-05

ics-05 隐藏的变量传参&#xff0c;php弱类型比较 只有设备维护中心可以点击进去 查看源码&#xff0c;发现有个隐藏的超链接变量传参 看到变量传参&#xff0c;有可能存在文件包含漏洞读取源码&#xff0c;这个站是php的站&#xff0c;所以可以使用php伪协议读取源码 index.p…

Docker Swarm管理(Docker技术集群与应用)

如上图所示&#xff0c; 三台主机&#xff1a;恢复到docker的快照&#xff1b; 然后上传到三台服务器所需的镜像&#xff1b; 同步会话。执行导入脚本将镜像导入到系统中&#xff1b; 然后取消会话的同步&#xff0c;设置各个主机的主机名&#xff1b; 然后同步会话修改hosts…

Java JUC(一) 线程概念与常用方法

Java JUC&#xff08;一&#xff09; 线程概念与常用方法 一. JUC 基本概念 Java JUC&#xff08;Java Util Concurrent&#xff09; 是Java平台提供的一个并发编程工具包&#xff08;java.util.concurrent&#xff09;&#xff0c;全称为Java Concurrency Utilities。这个工具…

深入剖析 MQTT 协议:物联网通信的核心力量

摘要&#xff1a; 本文全面深入地探讨了 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;协议。详细阐述了 MQTT 协议的起源与发展背景&#xff0c;介绍其基本概念、特点及工作原理。深入分析了 MQTT 的架构组成&#xff0c;包括客户端、代理服务器及主题的作…

Jenkins部署若依项目

一、配置环境 机器 jenkins机器 用途&#xff1a;自动化部署前端后端&#xff0c;前后端自动化构建需要配置发送SSH的秘钥和公钥&#xff0c;同时jenkins要有nodejs工具来进行前端打包&#xff0c;maven工具进行后端的打包。 gitlab机器 用途&#xff1a;远程代码仓库拉取和…

基于Linux的ARMxy工控机IEC61850协议实践

工业自动化水平的不断提高&#xff0c;对设备间高效、可靠通信的需求日益增长。IEC61850标准作为电力系统自动化领域的重要国际标准之一&#xff0c;其应用范围正在从传统的电力行业向更广泛的工业自动化领域扩展。本文将探讨基于ARM架构的工业计算机如何在Linux操作系统环境下…

解码未来:H.265与H.266技术对比及EasyCVR视频汇聚平台编码技术优势

随着视频技术的不断发展&#xff0c;视频编码标准也在不断更新迭代。H.265&#xff08;也称为HEVC&#xff0c;High Efficiency Video Coding&#xff09;和H.266&#xff08;也称为VVC&#xff0c;Versatile Video Coding&#xff09;作为当前和未来的主流视频编码标准&#x…

BrainSegFounder:迈向用于神经影像分割的3D基础模型|文献速递--Transformer架构在医学影像分析中的应用

Title 题目 BrainSegFounder: Towards 3D foundation models for neuroimagesegmentation BrainSegFounder&#xff1a;迈向用于神经影像分割的3D基础模型 01 文献速递介绍 人工智能&#xff08;AI&#xff09;与神经影像分析的融合&#xff0c;特别是多模态磁共振成像&am…

【机器学习】马尔可夫随机场的基本概念、和贝叶斯网络的联系与对比以及在python中的实例

引言 马尔可夫随机场&#xff08;Markov Random Field&#xff0c;简称MRF&#xff09;是一种用于描述变量之间依赖关系的概率模型&#xff0c;它在机器学习和图像处理等领域有着广泛的应用 文章目录 引言一、马尔科夫随机场1.1 定义1.2 特点1.3 应用1.4 学习算法1.5 总结 二、…

【数据分析预备】Pandas

Pandas 构建在NumPy之上&#xff0c;继承了NumPy高性能的数组计算功能&#xff0c;同时提供更多复杂精细的数据处理功能 安装 pip install pandas导入 import pandas as pdSeries 键值对列表 # 创建Series s1 pd.Series([5, 17, 3, 26, 31]) s10 5 1 17 2 3 3 26 4 31 dt…

Windows更新之后任务栏卡死?桌面不断闪屏刷新?

前言 小白这几天忙于工作&#xff0c;更新就变得异常缓慢。但就算这么忙的情况下&#xff0c;晚上休息的时间还是会给小伙伴们提供咨询和维修服务。 这不&#xff0c;就有一个小伙伴遇到了个很奇怪的问题&#xff1a;电脑Windows更新之后&#xff0c;任务栏点了没反应&#xf…

C++当中的多态(三)

&#xff08;六&#xff09;虚表的本质 其实我们大家应该都已经猜到了&#xff1a;我们虚表的本质就是一个函数指针数组。通过访问这个函数指针数组就可以得到我们想要的虚函数的地址&#xff0c;之后通过这个地址就可以调用我们相应的虚函数。我们这个函数指针数组是以nullptr…