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

devtools/2024/9/20 1:24:19/ 标签: 学习, 数据结构

线性表的定义

  • 线性表是零个或多个数据元素的有限序列,元素之间具有顺序性,如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有一个前驱和一个后继。线性表元素的个数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.ppmy.cn/devtools/111276.html

相关文章

C++:入门篇(补充C语言中的不足)

前言 这篇文章是C的第一篇文章&#xff0c;主要是补充C语言中存在的不足而扩展的一些新的语法&#xff0c;有了这篇文章作为杂序&#xff0c;后面再介绍其他内容就要清晰地多 C&#xff1a;入门篇 一、namespace 命名空间&#xff08;一&#xff09;域的概念&#xff08;二&…

计算机网络 --- 计算机网络的分类

一、计算机网络分类 1.1 按分布范围分类 举例&#xff1a;广域网&#xff08;WAN&#xff09;、局域网&#xff08;LAN&#xff09; 举例&#xff1a;个域网&#xff08;PAN&#xff09; 1.2 按传输技术分类 广播式网络――当一台计算机发送数据分组时&#xff0c;广播范围…

docker-compose 部署 flink

下载 flink 镜像 [rootlocalhost ~]# docker pull flink Using default tag: latest latest: Pulling from library/flink 762bedf4b1b7: Pull complete 95f9bd9906fa: Pull complete a880dee0d8e9: Pull complete 8c5deab9cbd6: Pull complete 56c142282fae: Pull comple…

404 error when doing workload anlysis using locust on OpenAI API (GPT.35)

题意&#xff1a;"使用 Locust 对 OpenAI API (GPT-3.5) 进行工作负载分析时出现 404 错误。" 问题背景&#xff1a; I am trying to do some workload analysis on OpenAI GPT-3.5-TURBO using locust. "我正在使用 Locust 对 OpenAI GPT-3.5-TURBO 进行一些…

Unity基本操作

API手册 Unity 脚本 APIhttps://docs.unity.cn/cn/2022.3/ScriptReference/index.html 在遇到不懂的方法、想更深入的学习或者是想查看是否有相应的方法实现某项功能&#xff0c;可以在Unity官方这里查看脚本。以Transform为例&#xff0c;可以直接搜索&#xff0c;或者在Unit…

狂奔的荣耀,稳健的苹果:AI Agent手机竞速赛

每一次技术革命&#xff0c;都需要一个技术落地的锚点&#xff0c;比如燃油革命时代的汽车&#xff0c;信息革命时代的PC与手机。而这一次以预训练大模型为主导的AI技术爆发中&#xff0c;被认为最有可能成为智能技术落地锚点的&#xff0c;就是AI Agent&#xff0c;或者称为智…

centos 服务器 多网卡 ip 地址 设置

centos 服务器 多网卡 ip 地址 设置 https://blog.csdn.net/xh_w20/article/details/141574357 cd /etc/sysconfig/network-scripts/ sudo systemctl status network ● network.service - LSB: Bring up/down networkingLoaded: loaded (/etc/rc.d/init.d/network; bad; v…

【LeetCode每日一题】——LCR 168.丑数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 优先队列 二【题目难度】 中等 三【题目编号】 LCR 168.丑数 四【题目描述…

AI prompt(提示词)

# 好用的用于学习的AI提示词 ## 费曼学习法 请使用费曼学习法&#xff0c;用简单的语言解释&#xff08;量子力学&#xff09;是什么&#xff0c;并提供一个简单的例子来说明它如何应用 ## 帕累托法则&#xff08;80/20原则&#xff09; 将&#xff08;量子力学&#xff09;最…

喜报 | 知从科技荣获 “AutoSec 安全之星 - 优秀汽车软件供应链安全方案奖”

近日&#xff0c;「AutoSec 2024第八届中国汽车网络安全周暨第五届智能汽车数据安全展」在上海盛大举行。本届大会由谈思实验室和谈思汽车主办、上海市车联网协会联合主办&#xff0c;以汽车“网络数据安全、软件安全、功能安全”为主题&#xff0c;设置了“31X”模式&#xff…

Redis 集群高可用详解及配置

关型数据库 关系型数据库&#xff1a; 是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库中的数据 主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库 关型数据库的优缺点 特点&#xff1a; 1、数据关系模型基于关系…

数据管理生态的核心解析:数据库、数据仓库、数据湖、数据平台与数据中台的关系与实现

1. 数据管理的复杂生态 在大数据时代&#xff0c;企业不仅要处理日益增长的海量数据&#xff0c;还需要应对数据类型的多样化。数据可以是结构化的交易数据&#xff0c;也可以是非结构化的日志、社交媒体内容、图像和视频。面对这些挑战&#xff0c;企业必须构建一套能够高效存…

K均值聚类(K Means Cluster)—无监督学习方法、非概率模型、判别模型、线性模型、非参数化模型、批量学习

定义 输入: n n n个样本的集合 X X X; 输出:样本集合的聚类 C ⋅ C^{\cdot} C⋅。 (1)初始化。令 t 0 t0 t0,随机选择 k k k个样本点作为初始聚类中心 m ( 0 ) ( m 1 ( 0 ) , ⋯ , m l ( l ) , ⋯ , m k ( 0 ) ) m^{(0)} \big( m_1^{(0)},\cdots,m_l^{(l)},\cdots,m_k^{(0)…

【jvm】记一次hive堆heap内存溢出的排查

先看下java的内存模型 监控jvm工具&#xff1a;visualVM 摘录一下内容&#xff1a; 由c开发的jvm&#xff0c;它巧妙地设计了java的设计理念——即万物皆对象。并设计了这些对象应该如何存储&#xff0c;如何调用&#xff0c;并通过不断迭代设计让对象的存储和回收&#xff0…

[项目][WebServer][读取请求 解析请求]详细讲解

目录 1.ReadLine2.RecvRequest3.ParseRequest4.RecvRequestBody 1.ReadLine 读取的基本单位&#xff1a;按照行来进行读取不同平台&#xff0c;对行分隔符的处理可能不同&#xff0c;所以要有一个函数可以统一处理不同平台的情况&#xff0c;兼容各种行分隔符 \r\n\r\n 本函数…

sqli-labs靶场自动化利用工具——第11关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#…

无人机动力系统设计基础知识

无人机动力系统设计基础知识 1. 源由2. 组成3. 部件规格3.1 电机规格书1. 电机型号&#xff08;Model Number&#xff09;2. 尺寸和重量&#xff08;Dimensions & Weight&#xff09;3. Kv 值&#xff08;Kv Rating&#xff09;4. 电压范围&#xff08;Operating Voltage R…

QT 读取Excel表

一、QAxObject 读取excel表的内容&#xff0c;其仅在windows下生效&#xff0c;当然还有其他跨平台的方案。 config qaxcontainer #include <QAxObject>QStringList GetSheets(const QString& strPath) {QAxObject* excel new QAxObject("Excel.Application&…

【前端UI框架】VUE ElementUI 离线文档 可不联网打开

【前端UI框架】VUE ElementUI 离线文档 可不联网打开 Element - The worlds most popular Vue UI framework Element - The worlds most popular Vue UI framework 离线文档下载地址 https://download.csdn.net/download/G971005287W/89742895 文档制作 第一步: 克隆源代码 …

opencv使用videocapture打开视频时,依赖opencv_ffmpeg***.dll,默认必须放到执行目录,自定义目录需要重新编译opencv库

1. 找到modules下opencv_highgui模块的cap_ffmpeg.cpp 2. 找到加载opencv_ffmpeg的接口, 修改接口内opencv_ffmpeg的路径即可.