线性顺序表算法库
list.cpp 具体函数实现
#include <stdio.h>
#include "list.h"
#include <malloc.h>/**************************************************
①函数名: CreateList
功 能: 用数组构建顺序表
参 数: ①SqList *&L:传入的线性表 ②ElemType a[]:使用的数组③int n: 线性表的长度(n < Maxsize)
返回值: 无
**************************************************/
void CreateList(SqList *&L, ElemType a[],int n)
{int i;//分配空间L = (SqList*)malloc(sizeof(SqList));for(i = 0; i<n; i++){L->data[i] = a[i];}L->length = n;
}/**************************************************
②函数名: InitList
功 能: 初始化线性表,重新分配空间,长度清成零
参 数: ①SqList *&L:要进行初始化的线性表
返回值: 无
**************************************************/void InitList(SqList *&L)
{L = (SqList*)malloc(sizeof(SqList)); //既然初始化了,直接重新分配空间L->length = 0;}/**************************************************
③函数名: DispalyList
功 能: 输出数组线性表到控制台
使用场景: 调试输出专用
参 数: ①SqList *L:所需展示的顺序表
返回值: void
**************************************************/
void DispalyList(SqList *L)
{if(L->length == 0) return;for(int i = 0; i< L->length; i++){printf("%d ",L->data[i]);}printf("\n");
}/**************************************************
④函数名: ListEmpty
功 能: 判断顺序表是否为空
参 数: ① SqList *L: 需要判断的顺序表
返回值: (bool类型) 是空表 ? 返回1 : 不是返回0
**************************************************/
bool ListEmpty(SqList *L)
{return(L->length == 0);
}/**************************************************
⑤函数名 : DestroyList
功 能: 释放顺序表空间
参 数: ① SqList *&L: 所需释放的线性表的指针地址
注 意: (1)
返回值: 无
**************************************************/
void DestroyList(SqList *&L) //(1)注意是指针地址
{//c语言, 直接freefree(L);}/**************************************************
⑥函数名:ListLength
功 能: 返回顺序表长度
参 数: ① SqList *L:传入顺序表的名字
返回值: int: 线性表长度值
**************************************************/
int ListLength(SqList *L)
{return (L->length);
}/**************************************************
⑦函数名:GetElem
功 能: 取线性表数组内,某个序号的元素值,并返回
参 数: ①SqList *L: 要取的线性表 ②int i:要取的序号(逻辑需要 1-n)③ElemType &e:返回到特定位置
注意:①合法性判断 ② 需要把逻辑(1~n)变成物理序号(0~n-1)
返回值: bool:是否获取成功
**************************************************/
bool GetElem(SqList *L,int i, ElemType &e)
{if(i<1 || i>L->length)//①{return false;}e = L->data[i-1]; //②return true;
}/**************************************************
⑧函数名: LocateElement
功 能: 查找特定元素值,在线性表中的位置(1~n)
参 数: ①ElemType element: 特定元素值 ② SqList *L:被查的线性表
返回值: int: 位置信息 (0没找到, 1~n, 即为位置)
**************************************************/
int LocateElement(ElemType element, SqList *L)
{int i = 0;while(i < L->length && L->data[i] != element) i++;//如果 i跳出后, i范围超过 L->length,则 没找到if(i >= L->length) return 0;else return i+1;}
/**************************************************
函数名: ListInsert
功 能: 把 e 插到到线性表 L 的第 i(逻辑序号) 个位置
参 数: (1)SqList *&L: 线性表L (2)int i: 插入到的逻辑位置(3) ElemType e:要插入的元素值
注意:① 可插入的位置逻辑序号为1~L->length+1②得出 j最后是等于 i+1, 所以j的范围是 j>i③从 j=L->length得出 , data[j] = data[j-1],从而确定整体范围
返回值: bool:是否插入完成
**************************************************/
bool ListInsert(SqList *&L,int i, ElemType e)
{int j;if(i<1 || i>L->length+1) //①return false;i--; //将顺序表的逻辑序号转化为物理序号for(j = L->length; j > i; j--) //② data[i+1] = data[i] => j = i+1{//③ data[i]~data[L->length-1]整体后移到data[i+1]~data[L->length]L->data[j] = L->data[j-1];}L->data[i] = e; //插入元素eL->length++; //顺序表插入增1return true; //成功插入返回true}/**************************************************
函数名: ListDelete
功 能: 删除顺序表特定位置的元素
参 数: (1)SqList *&L:被删的顺序表 (2)int i:位置(3)ElemType &e:删掉的值
注 意: ① 思路是整体前移,所以确定初始值i,然后定公式,看临界定 范围② 最后一个是 data[L->length-2] = data[L->length-1],得出 j = L->length-2
返回值: bool:是否删除成功? true : false
**************************************************/
bool ListDelete(SqList *&L, int i, ElemType &e)
{int j;if(i < 1 || i > L->length) return false;i--; //把逻辑序号转为物理序号e = L->data[i]; //将要删除的元素存储for(j = i;j < L->length-1; j++)//①将data[i...n-1]整体前移{//② data[i+1]~data[L->length-1] => data[i] ~ data[L->length-2]L->data[j] = L->data[j+1];}L->length--; //顺序表长度减去1return true;
}
list.h 算法库头文件
#ifndef LIST_H_INCLUDE
#define LIST_H_INCLUDE#define MaxSize 100typedef int ElemType; //自定义类型typedef struct //自定义结构体
{ElemType data[MaxSize];int length;
}SqList;//①用数组创建线性表
void CreateList(SqList *&L, ElemType a[],int n);
//②初始化线性表
void InitList(SqList *&L);
//③输出线性表
void DispalyList(SqList *L);
//④判断是否为空表
bool ListEmpty(SqList *L);
//⑤销毁线性表
void DestroyList(SqList *&L);//⑥ 求线性表的长度
int ListLength(SqList *L);//⑦求某个位置的数据元素值GetElem(L,i,e)
bool GetElem(SqList *L,int i, ElemType &e);//⑧ 元素 e 在 L中的序号(逻辑序号 1~n)
int LocateElement(ElemType element, SqList *L);//⑨ L中 第 i 位, 插入 e, ListInsert(L,i,e)
bool ListInsert(SqList *&L,int i, ElemType e);//⑩ 删除 L 中特定位置 i 的元素 e, ListDelete(L,i,e)
bool ListDelete(SqList *&L, int i, ElemType &e);#endif
main.cpp 测试函数
#include "list.h"
#include "stdio.h"
int main()
{SqList *sq;//②初始化线性表InitList(sq);//判断是否初始化后是空表if(ListEmpty(sq)){printf("初始化过后是空表\n");}ElemType elem;ElemType x[8] = {1,2,3,4,5,6,7,8};ElemType y[8] = {9,8,7,6,5,4,3,2};//①用数组创建线性表CreateList(sq, x,8);if(ListEmpty(sq) != 1){printf("新建后不是空表\n");}//③输出线性表DispalyList(sq);
④判断是否为空表
//bool ListEmpty(SqList *L);
//⑤销毁线性表DestroyList(sq);printf("空间释放后,输出看看啥情况\n");DispalyList(sq);CreateList(sq,y,8);//⑥ 求线性表的长度printf("新建一个y表,求一下长度是%d\n",ListLength(sq));//⑦求某个位置的数据元素值GetElem(L,i,e)if(GetElem(sq,1, elem)){printf("新y表第一个元素是%d\n",elem);}//⑧ 元素 e 在 L中的序号(逻辑序号 1~n)elem = LocateElement(6, sq);printf("6在y的第%d个位置\n",elem);if(ListDelete(sq, 3, elem)){printf("删除y的第三个元素%d,然后再输出一下y:\n",elem);DispalyList(sq);}//⑨ L中 第 i 位, 插入 e, ListInsert(L,i,e)if(ListInsert(sq,3,elem)){printf("再插入,就是玩,展示:\n");DispalyList(sq);}return 0;
}
演示结果:
相关文章:

线性顺序表算法库
list.cpp 具体函数实现 #include <stdio.h> #include "list.h" #include <malloc.h>/************************************************** ①函数名: CreateList 功 能: 用数组构建顺序表 参 数: ①SqList *&L:传入的线性表 ②ElemType a[]:使用…...

java分割等和子集(力扣Leetcode416)
分割等和子集 力扣原题链接 给你一个只包含正整数的非空数组nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] …...
383. 赎金信
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 func canConstruct(ransomNote …...

【二】【单片机】有关独立按键的实验
自定义延时函数Delay 分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中,直接使用。 //Delay.c void Delay(unsigned int xms) //11.0592MHz {while(xms--){unsigned char i, j;i 2;j 199;do{while (--j);}…...

AJAX踩坑指南(知识点补充)
JWT JSON Web Token是目前最为流行的跨域认证解决方案 如何获取:在使用JWT身份验证中,当用户使用其凭据成功登录时,将返回JSON Web Token(令牌) Token本质就是一个包含了信息的字符串 如何获取Token:登录成功之后,服务…...
备战蓝桥杯Day29 - 拼接最大数字问题
问题描述 有n个非负整数,将其按照字符串拼接的方式拼接为一个整数如何拼接可以使得得到的整数最大? 例: 32,94,128,1286,6,71可以拼接除的最大整数为 94716321286128。 问题思路 1.比较两个字符串的第一个数字,数值大的在前面,数值小的在…...

基于springboot的mysql实现读写分离
前言: 首先思考一个问题:在高并发的场景中,关于数据库都有哪些优化的手段?常用的有以下的实现方法:读写分离、加缓存、主从架构集群、分库分表等,在互联网应用中,大部分都是读多写少的场景,设置两个库,主库和读库,主库的职能是负责写,从库主要是负责读…...

Python爬虫之Scrapy框架系列(24)——分布式爬虫scrapy_redis完整实战【XXTop250完整爬取】
目录: 每篇前言:1.使用分布式爬取豆瓣电影信息(1)settings.py文件中的配置:(2)spider文件的更改:(3)items.py文件(两个项目一致!&…...

提升效率,稳定可靠:亚信安慧AntDB的企业价值
亚信安慧AntDB分布式数据库凭借平滑扩展、高可用性和低成本三大核心优势,在业界获得了极高的评价和认可。这些优点不仅为AntDB提供了巨大的市场发展潜力,也使其成为众多企业在数据管理上的首选解决方案。 AntDB的平滑扩展特性极大地提升了企业的灵活性和…...
洛谷入门——P1567 统计天数
统计天数 题目描述 炎热的夏日,KC 非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。 经历千辛万苦,他收集了连续 N ( 1 ≤ N ≤ 1 0 6 ) N(1 \leq N …...

C++概述
目录 一、C关键字(63个) 二、C几个关键点: 三、C语言缺陷一:命名冲突 四、C新概念:命名空间(namespace) 五、命名空间的嵌套: 六、展开命名空间:(using …...
Linux学习笔记16 - 系统命令
1. Linux 常见系统管理命令 命令含义格式su切换用户su [选项] [用户名]ps显示系统由该用户运行的进程列表ps [选项]top动态显示系统中运行的程序(一般为每隔 5s)topkill输出特定的信号给指定 PID(进程号)的进程,并根据…...
读书笔记--阅读华为数据治理之旅有感
通过阅读华为的数据治理之旅,了解到华为公司作为高科技企业的引领者,在数据治理工作、数字化智能化转型方面的确有许许多多值得大家学习的地方,华为公司的业务范围广泛,市场竞争压力大,迫切需要用一些高效的手段来减轻员工的工作量,让员工各司其职,在各自承担的主营业务…...

网络安全协议基本问题
Http和Https协议的端口号: Http:80 Https:443 网络监听: 网络监听是一种监视网络状态、数据流程以及网络上信息传输的工具,它可以将网络界面设定成监听模式,并且可以截获网络上所传输的信息。但是网络监…...
面试(一)
一. 说一下进程和线程的区别? (1)进程是资源分配的最小单位,线程是CPU调度的最小单位。 (2)线程是进程的一部分,一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程。 (3)进程有自己独立地址空间&a…...

libVLC windows开发环境搭建
1.简介 LibVLC是一个强大的开源库,它构成了VLC媒体播放器的核心部分。 LibVLC提供了一系列的功能接口,使得VLC能够处理流媒体的接入、音频和视频输出、插件管理以及线程系统等核心任务。 跨平台性:VLC作为一个跨平台的多媒体播放器&#x…...

【Netty】Netty的使用和常用组件详解
目录 一、简述 1.1 什么是Netty 1.2 Netty 的优势 1.3 为什么不用 Netty5? 1.4 为什么 Netty 使用 NIO 而不是 AIO? 1.5 为什么不用 Mina? 二、第一个 Netty 程序 2.1 Bootstrap、EventLoop(Group) 、Channel 2.1.1 Bootstrap 2.1.…...

Legacy|电脑Windows系统如何迁移到新安装的硬盘?系统迁移详细教程!
前言 前面讲了很多很多关于安装系统、重装系统的教程。但唯独没有讲到电脑换了新的硬盘之后,怎么把旧系统迁移到新的硬盘上。 今天小白就来跟各位小伙伴详细唠唠: 开始之前需要把系统迁移的条件准备好,意思就是在WinPE系统下,可…...
Windows 11 安装 Scoop
[Windows 11 安装 Scoop](Windows 11 安装 Scoop) 0. 引言 Scoop 从命令行安装您熟悉和喜爱的程序,差异最小。 它的主要功能如下: 消除权限弹出窗口 隐藏 GUI 向导样式的安装程序 防止PATH污染安装大量程序 避免安装和卸载程序的意外副作用 自动查…...

新能源汽车小三电系统
小三电系统 新能源电动汽车的"小三电"系统,一般指车载充电机(OBC)、车载 DC/DC 变换器,和高压直流配电盒(PDU)。一辆纯电动汽车一般配备一台OBC 和一台车载 DC/DC 变换器。OBC将外部输入的交流电转化为直流电输出给电池,DC/DC衔接…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...