快速利用c语言实现线性表(lineList)
线性表是数据结构中最基本和简单的一个,它是n的相同类型数据的有序序列,我们也可以用c语言中的数组来理解线性表。
一、线性表声明
我们定义一个线性表的结构体,内部有三个元素:其中elem是一个指针,指向线性表的头,length记录线性表元素个数,listsize记录线性表的总长度。
//
// Created by 111 on 2024/11/15.
//#ifndef TEST1_LINELIST_H
#define TEST1_LINELIST_H#define OK 1
#define ERROR 0#define LIST_INIT_SIZE 30 //初始化线性表大小
#define LIST_INCREMENT 10 //线性表长度不够时,每次动态增加的长度typedef struct
{int *elem; //指向线性表的头int length; //线性表元素个数int listsize; //线性表总长度
}LineList;int initLineList(LineList *);int lineListInsert(LineList *,int,int);int lineListDelete(LineList *,int);int printLineList(LineList *);int freeLineList(LineList *);int lineListLocateElem(LineList *,int elem);#endif //TEST1_LINELIST_H
二、线性表初始化
我们通过初始化函数,进行线性表的空间申请,一开始我们申请可以存有30个元素的线性表,具体函数如下:
int initLineList(LineList *L)
{L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int)); //动态申请堆空间,初始化30个元素if(!L->elem){printf("LineList allocate failed!"); //申请失败,提示错误,推出程序exit(ERROR);}L->length = 0; //记录元素个数L->listsize = LIST_INIT_SIZE; //记录线性表总大小return OK;
}
三、插入元素
插入元素我们通过指定位置进行插入,如果插入位置超过元素最大位置+1,则抛错;如果中间位置进行元素插入,我们则需要将后面的元素进行后移。

int lineListInsert(LineList *L,int i,int newelem)
{int *tmpaddr; //用来存放扩展后的线性表地址int *tmpdata; //用来存放临时元素的地址int *q;if(i<1||i>L->length+1) //如果超过位置,则报错return ERROR;if(L->length>=L->listsize){tmpaddr = (int *)realloc(L->elem,(L->listsize+LIST_INCREMENT)*sizeof(int));//元素个数超过线性表最大大小,则进行动态扩展if(!tmpaddr){printf("linesize reallocate failed!\n");exit(ERROR);}L->elem = tmpaddr;//线性表新地址L->listsize += LIST_INCREMENT;//线性表总大小该表}tmpdata =(L->elem+i-1);for(q = (L->elem+L->length-1);q>=tmpdata;--q) //从线性表最后一个元素开始,进行元素后移*(q+1) = *q; //插入元素*tmpdata = newelem;++L->length;return OK;
}
四、删除元素
删除一个元素后,我们需要将后续的元素进行前移动,确保线性表的连续:

int lineListDelete(LineList *L,int index)
{if(index<1||(index>L->length)) //错误的位置,返回ERROR{return ERROR;}int *tmpdel = L->elem+index; //临时存放删除元素的后一个元素int *mp = L->elem + L->length -1; //指向最后一个元素for(tmpdel;tmpdel<=mp;++tmpdel){ //从删除位置开始,进行元素前移*(tmpdel-1)= *tmpdel;}--L->length;return OK;}
五、元素定位
返回第一个匹配元素的位置,如果都不匹配,则返回0.
int lineListLocateElem(LineList *L,int elem)
{int i=1;int *p = L->elem;while(i<=L->length&&(*p++)!=elem)++i;if(i<=L->length)return i;elsereturn 0;
}
六、打印线性表
int printLineList(LineList *L)
{int *p = L->elem;for(int i =0 ;i<L->length;i++){printf("the %d element is %d\n",(i+1),*(L->elem+i));}return OK;
}
七、释放空间
int freeLineList(LineList *L)
{free(L->elem);return OK;
}
八、测试
我们在main函数中进行测试的编写,验证上述函数的功能。
int main() {LineList l;initLineList(&l);lineListInsert(&l,1, 10);lineListInsert(&l,2, 18);lineListInsert(&l,2,20);printLineList(&l);lineListDelete(&l,2);printf("after the linelist deleted.....\n");printLineList(&l);freeLineList(&l);return 0;
}

相关文章:
快速利用c语言实现线性表(lineList)
线性表是数据结构中最基本和简单的一个,它是n的相同类型数据的有序序列,我们也可以用c语言中的数组来理解线性表。 一、线性表声明 我们定义一个线性表的结构体,内部有三个元素:其中elem是一个指针,指向线性表的头&am…...
量子计算与人工智能的交汇:科技未来的新引擎
引言 在当今飞速发展的科技世界,人工智能(AI)和量子计算无疑是最受瞩目的两大前沿领域。人工智能凭借其在数据处理、模式识别以及自动化决策中的强大能力,已经成为推动各行业数字化转型的重要力量。而量子计算则通过颠覆传统计算机…...
51单片机使用NRF24L01进行2.4G无线通信
本文并不打算详细介绍NRF24L01的各个功能寄存器及指令的详细用法,因为网上都可以搜到很多非常详细的教程文档,这里只是介绍一些基本概念、用法以及代码的解释,旨在帮助新手能够快速上手调通快速使用。 基础概念 该模块使用的是SPI协议&…...
HelloMeme 上手即用教程
HelloMeme是一个集成空间编织注意力的扩散模型,用于生成高保真图像和视频。它提供了一个代码库,包含实验代码和预训练模型,支持PyTorch和FFmpeg。用户可以通过简单的命令行操作来生成图像和视频。 本文将详细介绍,如何在GPU算力租…...
自定义call方法和apply方法
自定义call方法 //Fn:要执行的函数,obj:函数中this的指向,args:剩余参数function call(Fn, obj, ...args) {//判断if (obj undefined || obj null) {obj globalThis; //全局对象 globalThis:es11新增的特性,用来指向…...
typescript中为js文件提供类型声明
案例:为JS文件提供类型声明 场景描述 假设我们有一个JavaScript文件 utils.js,其中包含一些实用工具函数和变量。为了在TypeScript中使用这些函数和变量并获得类型提示,我们可以使用 declare 关键词为它们提供类型声明。 1. 创建 JavaScri…...
ETH挖矿显卡超频信息汇总
NVIDIA 显卡 显卡型号 核心频率增减量 内存频率增减量 功耗墙(W) 预估算力(ethash算法) RTX 3090-3001000285W / 80%120 MH/sRTX 3080-150900220W / 68%98 MH/sRTX 3070-5001100130W / 60%60 MH/sRTX 3060 Ti-5001200130W / 65%60 MH/sRTX 2080 Ti-2001100150W /…...
调用 Xinference OpenAI接口时报错 Model not found in the model list, uid
错误如下, 请不要被错误吓住或蒙蔽双眼, 自己看最下面的报错内容 Traceback (most recent call last): File "C:\Users\HW\.conda\envs\aibot\Lib\site-packages\starlette\responses.py", line 259, in __call__ await wrap(partial(self.listen_for_disconn…...
一文说清:C静态库与动态库的区别
一 前言 大家在用C语言编程时,一定会遇到各种库,它们为开发者提供了大量的预编译函数和数据结构,从而极大地提高了软件开发的效率。 在C语言中,库主要分为两种类型: 静态库(Static Library)&…...
Mysql 5.7.6以上版本怎样关闭GTID(由GTID改为基于file,position方式)
平时不建议关闭GTID,假如开启GTID遇到问题,需要回退到基于file,position方式,则可以执行如下步骤: 1.在从库停止主从复制: STOP SLAVE; CHANGE MASTER TO MASTER_AUTO_POSITION 0; START SLAVE; SHOW SLAVE STAT…...
MATLAB常见数学运算函数
MATLAB中含有许多有用的函数,可以随时调用。 a b s abs abs函数 a b s abs abs函数在MATLAB中可以求绝对值,也可以求复数的模长:c e i l ceil ceil函数 向正无穷四舍五入(如果有小数,就向正方向进一)f l o o r floor floor函数 向负无穷四舍五入(如果有小数,就向负方向…...
设置Fusion360 - Prusa slicer -octoprint 一键打印流程
此流程可以直接从fusion360导出文件到prusa slicer切片,切片后可以一键上传并开始打印。以下操作在MacOS中进行,Windows也可以参考。 Fusion360中点击文件-3D打印 弹出对话框中点击应用程序,并在从我的计算机选择中选取Prusa Slicer的可执行…...
IO流实用案例:用字节流--输入流(Inpustream)、输出流(OutputStream)写一个拷贝图片的案例--超简单!
案例背景: 我的电脑桌面有一张白敬亭的照片,我们需要把这张照片拷贝到我的电脑D:\学习软件\copyBJT目录下,当前我们这个目录是没有东西的。 代码演示以及注释: ublic class StreamCopy {public static void main(String[] args)…...
Tensorflow基本概念
简介:本文从Graph讲到Session,同时讲解了tf.constant创建tensor的用法和variable需要初始化的知识点,可以给你打好一个学习Tensorflow的基础。本文都是基于TensorFlow1.14.0的版本下运行。 本专栏将会系统的讲解TensorFlow在1.14.0版本下的各…...
游戏引擎学习第九天
视频参考:https://www.bilibili.com/video/BV1ouUPYAErK/ 修改之前的方波数据,改播放正弦波 下面主要讲关于浮点数 1. char(字符类型) 大小:1 字节(8 位)表示方式:char 存储的是一个字符的 A…...
CondaError: Run ‘conda init‘ before ‘conda activate‘解决办法
已经执行了conda init,但是还是会报错CondaError: Run ‘conda init’ before ‘conda activate’ 原因:权限不够 解决办法:以管理员身份运行cmd,然后进入要操作的文件夹下,重新执行 conda init 和 conda activate 就可…...
如何提高谷歌浏览器的稳定性
谷歌浏览器是全球使用最广泛的网络浏览器之一,以其速度和易用性著称。然而,随着时间的推移,用户可能会遇到一些稳定性问题,比如页面加载缓慢、崩溃或意外关闭等。本文将提供一些实用的技巧来帮助你提高谷歌浏览器的稳定性…...
Spring基础之——控制反转(IOC)、依赖注入(DI)与切面编程(AOP)概念详解(适合小白,初学者必看)
前言 本篇博客讲详细介绍Spring框架中的两个最核心且最基础的概念:控制反转(IOC)和面向切面编程(AOP)。以及如何通过IDEA来构建一个Spring项目,通过实战和理论结合的方式来让大家真的学会Spring这个最流行的…...
java排序算法汇总
一、排序算法我介绍 1.1、介绍 排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。 1.2、排序的分类: 1) 内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。 2) 外部排序法&…...
游戏引擎中LOD渲染技术
一.LOD(Level Of Detail) 为了降低GPU渲染压力,根据摄像机距离模型距离将面数较高的模型替换为面数较低的模型. LOD LOD0(distance<10) LOD1(distance<20) LOD2(distance<30) 故通常引擎中MetaMesh是由一个或多个LOD模型构成. MetaMesh mesh mesh.lod1 mesh.lod…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
