当前位置: 首页 > news >正文

数据结构大合集02——线性表的相关函数运算算法

函数运算算法合集02

  • 顺序表的结构体
  • 顺序表的基本运算的实现
    • 1. 建立顺序表
    • 2. 顺序表的基本运算
      • 2.1 初始化线性表
      • 2. 2 销毁顺序表
      • 2.3 判断顺序表是否为空表
      • 2.4 求顺序表的长度
      • 2.5 输出顺序表
      • 2.6 按序号求顺序表中的元素
      • 2.7 按元素值查找
      • 2.8 插入数据元素
      • 2.9 删除数据元素
  • 单链表的结构体
  • 单链表的基本运算的实现
    • 1.建立单链表
      • 1.1头插法
      • 1.2尾插法
    • 2.单链表的基本运算
      • 2.1 初始化单链表
      • 2.2 销毁单链表
      • 2.3 判断单链表是否为空表
      • 2.4 求单链表的长度
      • 2.5 输出单链表
      • 2.6 按序号求单链表的元素
      • 2.7 按元素值查找
      • 2.8 插入数据元素
      • 2.9 删除元素数据
  • 双链表的结构体
  • 双链表的基本运算的实现
    • 1.建立双链表
      • 1.1头插法
      • 1.2尾插法
    • 2.双链表的基本运算
      • 2.1 插入数据元素
      • 2.2 删除数据元素

注:
本篇文章的概念合集
数据结构的概念大合集02(线性表)

顺序表的结构体

typedef struct
{ElemType data[MaxSize];int length;
} SqList;

顺序表的基本运算的实现

1. 建立顺序表

//建立顺序表
void CreatList(SqList *L,ElemType a[],int n)
{int i = 0,k = 0;L = (SqList *)malloc(sizeof(SqList));while(i<n){L->data[k] = a[i];k++ ;i++;}L->length = k;
}

2. 顺序表的基本运算

2.1 初始化线性表

//初始化线性表
void InitList(SqList *L)
{L = (SqList *)malloc(sizeof(SqList));L ->length = 0;
}

2. 2 销毁顺序表

//销毁顺序表
void DestroyList(SqList *L)
{free(L);
}

2.3 判断顺序表是否为空表

//判断顺序表是否为空表
bool ListEmpty(SqList *L)
{return(L->length == 0);
}

2.4 求顺序表的长度

//求顺序表的长度
int ListLength(SqList *L)
{return(L->length);
}

2.5 输出顺序表

//输出顺序表
void DisList(SqList *L)
{int i;for(i = 0; i < L->length; i++){printf("%d",L->data[i]);printf("\n");}
}

2.6 按序号求顺序表中的元素

//按序号求顺序表中的元素,采用bool性,即可以满足函数所需功能,还能增加复用性
bool GetElem(SqList * L,int i,ElemType *e)
{if(i < 1 || i > L->length) return false;e = L->data[i-1];return true;
}

2.7 按元素值查找

//按元素值查找
int LocateElem(SqList *L,ElemType e)
{int i;while(i < L->length && L->data[i] == e){i++;}if(i >= L->length){return 0;}else{return i+1;}
}

2.8 插入数据元素

//插入数据元素,在i位置插入元素e<==>把i后面的元素后移一个位置
bool ListInsert(SqList * L,int i,ElemType e)
{int j;if(i < 1 || i > L->length+1 || L->length == MaxSize)return false;i--;for(j = L->length; j > i; j--)  //此循环就是为了做到时i后面的元素后移一个位置{L->data[j] = L->data[j-1];};L->data[i] = e;L->length++;return true;
}

2.9 删除数据元素

//删除数据元素
bool ListDelet(SqList *L,int i,ElemType *e){int j;if(i<1 || i > L->length)return false;e = L->data[i];for(j = L->length; j >= i; j--){L->data[j-1] = L->data[j];}L->length--;return true;
}

单链表的结构体

typedef struct LNode{ElemType data;struct Lnode *next;
}LinkNode;

单链表的基本运算的实现

1.建立单链表

1.1头插法

//建立单链表——头插法
void CreatListF (LinkNode *L,ElemType a[],int n){LinkNode *s;L = (LinkNode*)malloc(sizeof(LinkNode));L->next = NULL;for(int i = 0; i < n; i++){s = (LinkNode*)malloc(sizeof(LinkNode));s->data = a[i];s->next = L->next;  //将s的后继结点始终置空,这是为了让尾结点的指针置空L->next = s;    //将头结点的指针始终指向新插入进来的元素}
}

使用头插法后,数组a里面的元素会倒置,比如a[5] = {1,2,3,4,5},头插法后,链表里面的元素是 5,4,3,2,1 ,具体原因可以多体会一下上述代码中的for循环部分。

1.2尾插法

//建立单链表——尾插法
void CreatListR(LinkNode *L,ElemType a[],int n){LinkNode *s,*r;L = (LinkNode*)malloc(sizeof(LinkNode));r = L;for(int i = 0;i < n;i++){s = (LinkNode*)malloc(sizeof(LinkNode));s->data = a[i];r->next = s;    //将r的后继结点指向sr=s;    //将s赋给r,相当于将r后移,这样,结合上行代码,就可以是元素依次插入到头结点后面,且顺序不会倒置}r -> next = NULL;   //经过循环后,r变成尾结点,此行代码,就是为了让尾指针为空
}

与头插法不同,尾插法后得到的元素不会倒置,这都是 LinkNode* r 的功能

2.单链表的基本运算

2.1 初始化单链表

void InitList(LinkNode *L)
{L = (LinkNode*)malloc(sizeof(LinkNode));L->next = NULL;
}

2.2 销毁单链表

//销毁单链表
void DestroyList(LinkNode *L)
{LinkNode *pre = L, *p = L->next;while(p!=NULL){free(pre);pre = p;p = pre->next;}free(pre);
}

2.3 判断单链表是否为空表

//判断单链表是否为空
bool ListEmpty(LinkNode *L)
{return(L->next == NULL);
}

2.4 求单链表的长度

//求链表的长度
int ListLenth(LinkNode *L)
{int n = 0;LinkNode *p;while(p != NULL){n++;p = p->next;}return n;
}

2.5 输出单链表

//输出单链表
void DispList(LinkNode *L)
{LinkNode * p = L->next;while (p != NULL){printf("%d",p->data);p=p->next;}printf("\n");
}

2.6 按序号求单链表的元素

//按序号求单链表中的元素
bool GetElem(LinkNode * L,int i,ElemType *e)
{int j = 0;LinkNode *p = L;if(i <= 0) return false;while(j < i && p != NULL){j++;p = p->next;}if(p == NULL){return false;}else{e = p->data;return true;}
}

2.7 按元素值查找

//按元素值查找
int LocateElem(LinkNode *L,ElemType e){int i = 1;LinkNode *p = L->next;while(p != NULL && p->data != e){p = p->next;i++;}if(p == NULL)return 0;elsereturn i;
}

2.8 插入数据元素

//插入数据元素
bool ListInsert(LinkNode *L,int i,ElemType e){int j = 0;LinkNode *p = L,*s;if(i <= 0) return false;while(j < i-1 && p != NULL){j++;p = p->next;}if(p == NULL){return false;}else{s = (LinkNode*)malloc(sizeof(LinkNode));s->data = e;s->next = p->next;p->next = s;return true;}
}

2.9 删除元素数据

//删除数据元素
bool listDelete(LinkNode *L,int i,ElemType *e){int j = 0;LinkNode *p = L,*q;if(i <= 0) return false;while(j < i-1 && p!= NULL){j++;p=p->next;}if(p == NULL){return false;} else {q = p->next;if(q == NULL)return false;e = q->next;p->next = q->next;free(q);return true;}
}

双链表的结构体

双链表的基本运算的实现

1.建立双链表

1.1头插法


//建立双链表——头插法
void CreatListF(DLinkNode *L, ElemType a[],int n)
{DLinkNode *s;L = (DLinkNode*)malloc(sizeof(DLinkNode));L->next = L->prior = NULL;for(int i = 0; i < n; i++){s = (DLinkNode*)malloc(sizeof(DLinkNode));  //在循环里面开辟内存,方便a[i]插入s->data = a[i];     s->next = L->next;  if(L->next != NULL)  //若 L 非空,则修改 L->next 的前驱指针{L->next->prior = s;}L->next = s;s->prior = L;}
}

1.2尾插法

//建立双链表——尾插法
void CreatListR(DLinkNode *L, ElemType a[],int n)
{DLinkNode *s,*r;L = (DLinkNode*)malloc(sizeof(DLinkNode));r = L:for(int i = 0; i < n; i++){s = (DLinkNode*)malloc(sizeof(DLinkNode));s->data = a[i];r->next = s;s->prior = r;r = s;}r->next = NULL;
}

2.双链表的基本运算

对于双链表的一些基本运算而言,比如求长度,取元素值,查找元素等与单链表相同,这里就不再展开了,但双链表的插入与删除结点就不同于单链表了,这里做详细说明

2.1 插入数据元素

//插入数据元素
bool ListInster(DLinkNode *L,int i, ElemType e)
{int j = 0;DLinkNode *p = L,*s;if (i <= 0) return false;while(j < i - 1 && p != NULL){j++;p = p->next;}if( p == NULL) return false;else{s = (DLinkNode*)malloc(sizeof(DLinkNode));s->data = e;s->next = p->next;if(p->next != NULL){p->next->prior = s;}s->prior = p;p->next = s;return true;}
}

2.2 删除数据元素

//删除数据元素
bool ListDelet(DLinkNode *L,ElemType *e)
{int j = 0;DLinkNode *p = L,*q;if(i <= 0)  return false;while(j < i-1 && p != NULL){j++;p = p->next;}if(p == NULL)  return false;else{q = p->next;if(q == NULL)    return false;e = q->data;p->next = q ->next;if(q->next != NULL)q->next->prior = p;free(q);}
}

相关文章:

数据结构大合集02——线性表的相关函数运算算法

函数运算算法合集02 顺序表的结构体顺序表的基本运算的实现1. 建立顺序表2. 顺序表的基本运算2.1 初始化线性表2. 2 销毁顺序表2.3 判断顺序表是否为空表2.4 求顺序表的长度2.5 输出顺序表2.6 按序号求顺序表中的元素2.7 按元素值查找2.8 插入数据元素2.9 删除数据元素 单链表的…...

threejs案例,与静态三角形网格的基本碰撞, 鼠标环顾四周并投球游戏

创建一个时钟对象: const clock new THREE.Clock();这行代码创建了一个新的THREE.Clock对象&#xff0c;它用于跟踪经过的时间。这在动画和物理模拟中很有用。 2. 创建场景: const scene new THREE.Scene();这行代码创建了一个新的3D场景。所有的物体&#xff08;如模型、灯…...

将FastSAM中的TextPrompt迁移到MobileSAM中

本博文简单介绍了SAM、FastSAM与MobileSAM,主要关注于TextPrompt功能的使用。从性能上看MobileSAM是最实用的,但其没有提供TextPrompt功能,故而参考FastSAM中的实现,在MobileSAM中嵌入TextPrompt类。并将TextPrompt能力嵌入到MobileSAM官方项目提供的gradio.py部署代码中,…...

KY191 矩阵幂(用Java实现)

描述 给定一个n*n的矩阵&#xff0c;求该矩阵的k次幂&#xff0c;即P^k。 输入描述&#xff1a; 第一行&#xff1a;两个整数n&#xff08;2<n<10&#xff09;、k&#xff08;1<k<5&#xff09;&#xff0c;两个数字之间用一个空格隔开&#xff0c;含义如上所示…...

基于Python的股票市场分析:趋势预测与策略制定

一、引言 股票市场作为投资领域的重要组成部分&#xff0c;其价格波动和趋势变化一直是投资者关注的焦点。准确预测股票市场的趋势对于制定有效的投资策略至关重要。本文将使用Python编程语言&#xff0c;结合时间序列分析和机器学习算法&#xff0c;对股票市场的历史数据进行…...

【C++】了解一下编码

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. ASCII编码3. unicode4. GBK5. 类型转换 1. 前言 看到string里面还有Template instantiations&#xff1a; string其实是basic_string<char>&#xff0c;它还是一个模板。 再看看wstring&#xff1…...

生成式人工智能在金融领域:FinGPT、BloombergGPT及其未来

生成式人工智能在金融领域的应用&#xff1a;FinGPT、BloombergGPT 及其他 引言 生成式人工智能&#xff08;Generative AI&#xff09;是指能够生成与输入数据相似的新数据样本的模型。ChatGPT 的成功为各行各业带来了许多机会&#xff0c;激励企业设计自己的大型语言模型。…...

webpack5零基础入门-10babel的使用

Babel JavaScript 编译器。 主要用于将 ES6 语法编写的代码转换为向后兼容的 JavaScript 语法&#xff0c;以便能够运行在当前和旧版本的浏览器或其他环境中 1.安装相关包 npm install -D babel-loader babel/core babel/preset-env 2.进行相关配置 2.1第一种写法是在webp…...

SAR ADC教程系列5——FFT频谱泄露以及相干采样

频谱泄露的出现以及如何规避&#xff1f; 为什么要相干采样&#xff1f; 1.分析ADC输出信号的频谱工具&#xff1a;DFT&#xff08;Discrete Fourier Transform) 重点&#xff1a;DFT相邻频谱频率间隔为fs/N 如何规避频谱泄露&#xff1f; 对于DFT&#xff0c;它对于接收到的信…...

算法D48 | 动态规划10 | 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

股票问题是一个动态规划的系列问题&#xff0c;今日安排的题目不多&#xff0c;大家可以慢慢消化。 121. 买卖股票的最佳时机 视频讲解&#xff1a;https://www.bilibili.com/video/BV1Xe4y1u77q https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A…...

Windows10安装RubyRails步骤

2024年3月14日安装&#xff0c;亲测。记录一下以便后续需要查看。 首先在官网下载RubyInstaller for Windows - 国内镜像 rubyinstaller.cn 版本是3.3.0 下载完后图形化界面安装 安装完毕&#xff0c;出现Ruby的命令行&#xff0c;或者在开始菜单出现start command prompt wi…...

Sqlserver 模糊查询中文及在mybatis xml【非中文不匹配查询】N@P2问题

问题 sqlserver模糊查询或相等&#xff0c;两者都无法查询。 百度方案解释 Like 后的N是表示unicode字符。获取SQL Server数据库中Unicode类型的数据时&#xff0c;字符串常量必须以大写字母 N 开头&#xff0c;否则字符串将转换为数据库的默认代码页(字符集编码)&#xff0…...

旧华硕电脑开机非常慢 电脑开机黑屏很久才显示品牌logo导致整体开机速度非常的慢怎么办

前提条件 电池需要20&#xff05;&#xff08;就是电池没有报废&#xff09;且电脑接好电源&#xff0c;千万别断电&#xff0c;电脑会变成砖头的 解决办法 更新bios即可解决&#xff0c;去对应品牌官网下载最新的bios版本就行了 网上都是一些更新驱动啊...

【go语言开发】性能分析工具pprof使用

本文主要介绍如何在项目中使用pprof工具。首先简要介绍pprof工具的作用&#xff1b;然后介绍pprof的应用场景&#xff0c;主要分为工具型应用和服务型应用。最后数据分析项目&#xff0c;先采集项目信息&#xff0c;再可视化查看 文章目录 前言应用场景工具型应用服务型应用 数…...

ARM_基础之RAS

Reliability, Availability, and Serviceability (RAS), for A-profile architecture 源自 https://developer.arm.com/documentation/102105/latest/ 1 Introduction to RAS 1.1 Faults,Errors,and failures 三个概念的区分&#xff1a; • A failure is the event of devia…...

VScode(1)之内网离线安装开发环境(VirtualBox+ubuntu+VScode)

VScode(1)之内网离线安装开发环境(VirtualBoxubuntuVScode) Author: Once Day Date: 2022年7月18日/2024年3月17日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文…...

Python爬虫与数据可视化源码免费领取

引言 作为一名在软件技术领域深耕多年的专业人士&#xff0c;我不仅在软件开发和项目部署方面积累了丰富的实践经验&#xff0c;更以卓越的技术实力获得了&#x1f3c5;30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定&#xff0c;也是对我的创新精神和专业承诺…...

Android Studio 打包 Maker MV apk 详细步骤

一.使用RPG Make MV 部署项目&#xff0c;获取项目文件夹 这步基本都不会有问题&#xff1a; 二.安装Android Studio 安装过程参考教材就行了&#xff1a; https://blog.csdn.net/m0_62491877/article/details/126832118 但是有的版本面板没有Android的选项&#xff08;勾…...

react中hooks使用限制

只能在最顶层使用Hook 不要在循环、条件中调用hook&#xff0c;确保总是在React函数最顶层使用它们 只能React函数中调用Hook 不要在普通的js函数中调用 在React的函数组件中调用Hook 在自定义hook中调用其他hook 原因&#xff1a; 我们每次的状态值或者依赖项存在哪里&…...

2024抖音矩阵云混剪系统源码 短视频矩阵营销系统

2024抖音矩阵云混剪系统源码 短视频矩阵营销系统 矩阵营销系统多平台多账号一站式管理&#xff0c;一键发布作品。智能标题&#xff0c;关键词优化&#xff0c;排名查询&#xff0c;混剪生成原创视频&#xff0c;账号分组&#xff0c;意向客户自动采集&#xff0c;智能回复&am…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...