文章目录

  • 表栈、队列、二叉树
    • 一、二叉树
    • 二、表栈
    • 三、队列
  • 链表
    • 一、单向链表
    • 二、循环链表、双向链表和双向循环链表
  • 预处理
    • 一、预处理
    • 二、宏定义
  • 文件
    • 文件操作补充

本篇文章是对二次学习C语言12——文件操作 二次学习C语言14——预处理及模块化 二次学习C语言15——链表 二次学习C语言17——栈、队列、二叉树的部分补充说明,感兴趣的话可以了解一下,这一系列C语言blog不会很仔细,主要是帮助有一些C语言基础但想快速回顾一下的友友;但也不会质量很差,不然就失去了它存在的意义。还是很希望大家在相应blog评论区多多指出疑惑或分享实际问题的,这样我们就可以共同进步啦!

表栈、队列、二叉树

一、二叉树

  • 二叉树的遍历

分三种:

  1. 先序遍历,根 左 右
  2. 中序遍历,左 根 右
  3. 后序遍历,左 右 根

在这里插入图片描述

	* 先序遍历(根左右):ABCDEFGHK
A为根先左B,B为根仅右C,C为根仅左D,D无左右,
A为根后右E,E为根仅右F,F为根仅左G,G为根先左H后右K
下面以对应规则类推* 中序遍历(左 根 右):BDCAEHGKF* 后序遍历(左 右 根):DCBHKGFEA

树型结构是以分支关系定义的层次结构,它是一种重要的非线性结构

树(tree) 是由一个或多个结点组成的有限集合T 。

  1. 一个特定的结点称为该树的根(root)结点
  2. 结点之外的其余结点可分为m(m ≥ 0)个互不相交的有限集合 T1 ,T2 ,…,Tm ,且其中每一个集合本身又是一棵树,称之为根的子树(subtree)

注意:
树的递归定义刻画了树的固有特性:一棵非空树是由若干棵子树构成的,而子树又可由若干棵更小的子树构成。

树结构的基本术语如下。

结点的度(Degree):树中的一个结点拥有的子树数目,如:A结点的度为2

树的度:是指该树中结点的最大度数。如树T的度为2。

叶子结点(Leaf) 或终端结点:度为零的结点。如D、H、K都是叶子结点。

分支结点或非终端结点:度不为零的结点。A、B、C、E、F、G都是分支结点。

孩子结点或儿子:树中某个结点的子树之根。如A的孩子结点为B、E。

双亲结点或父亲:孩子结点的上层结点。

兄弟结点(Sibling):同一个双亲的孩子。

结点的层数(Level):从根起算,根的层数为1,它的孩子的层数为2……若某结点在第i层,它的孩子结点就在第i+1层。

树的高度(Height)深度(Depth):树中结点的最大层数。如树T的高度为5

有序树(OrderedTree):将树中每个结点的各子树看成是从左到右有次序的(即不能互换),二叉树就是有序树。(二叉树的左子树和右子树是严格区分并且不能随意颠倒的

  • 二叉树的性质
  1. 性质1: 二叉树第i层上的结点数目最多为2i-1(i≥1)
  2. 性质2: 深度为k的二叉树至多有2k-1个结点(k≥1)
  3. 性质3: 在任意一棵二叉树中,若叶子结点(即度为0的结点)的个数为n0,度为1的结点数为n1,度为2的结点数为n2,则no=n2+1

满二叉树(FullBinaryTree) :一棵深度为k且有2k-1个结点的二叉树称为满二叉树。

其特点:
1.每一层上的结点数都达到最大值。即如果高度确定,它是具有最多结点数的二叉树。

2.满二叉树中不存在度数为1的结点,每个分支结点均有两棵高度相同的子树,且树叶都在最下一层上。

完全二叉树(Complete BinaryTree) :若一棵二叉树至多只有最下面的两层上结点的度数可以小于2,并且最下一层上的结点都集中在该层最左边的若干位置上,则此二叉树称为完全二叉树。

其特点:
1.满二叉树是完全二叉树,完全二叉树不一定是满二叉树。
2.在满二叉树的最下一层上,从最右边开始连续删去若干结点后得到的二叉树仍然是一棵完全二叉树。
3.在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子,即该结点必是叶结点。

二叉树的存储结构有多种,最常用的有两种:是顺序存储结构链表存储结构

优点和缺点
① 对完全二叉树而言,顺序存储结构既简单又节省存储空间。

② 一般的二叉树采用顺序存储结构时,虽然简单,但易造成存储空间的浪费。

③ 在对顺序存储的二叉树做插入和删除结点操作时,要大量移动结点。

二、表栈

  • 线性表

    最简单、最常用的一种数据结构,是具有相同数据类型的n(n≥0)个数据元素(结点)的有限序列。通常记为:(a1,a2,…,an )。其中n称为线性表的长度,当n=0的时表示空表。

    • ①顺序表

    用一段连续的内存空间来存储线性表的数据元素,C语言中是通过数组来实现

    • ②链表

即二次学习C语言15——链表

  • 栈(zhan)

==堆栈(Stack)==可以看成是一种“特殊的“线性表,这种线性表上的插入和删除运算限定在表的某一端进行的。

先进后出(FILO)的特点也可以描述为后进先出,简称为LIFO表

  1. 通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)
  2. 当表中没有元素时称为空栈
  3. 退栈:删除。
  4. 进栈:插入。

三、队列

队列(Queue) 是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。

  1. 允许删除的一端称为队头(Front)

  2. 允许插入的一端称为队尾(Rear)

  3. 当队列中没有元素时称为空队列

  4. 队列简称为FIFO表

链表

一、单向链表

在链表结构中,每个节点仅存储本身需要存储的数据和下一个节点地址的这种链表结构,我们称为单向链表结构

数组与链表对比①:

数组在进行数据的插入,删除操作时,为了保证内存数据的连续性,往往需要做大量的数据搬移工作,所以时间复杂度是O(n)

链表中插入或删除数据时,因为链表结构中的节点并不需要连续的存储空间,所以在链表中进行数据的插入和删除时并不需要搬移节点。对于链表的删除和插入操作,我们只需要调整相邻节点的后继指针即可,所以对应的时间复杂度是O(1)

数组与链表对比②:

数组的内存数据是连续的,当我们需要访问第k个元素时,通过基地址(base_address)和数据类型大小就可以随机访问到数据所在的内存地址,时间复杂度是O(1)

对于链表来讲,因为链表中各个节点的数据在内存中时分散的,不像数组那样是连续的存储空间,所以要访问链表中的第k个元素,只能从头结点开始,根据节点间的后继指针或引用逐一遍历,直到找到相应的节点,所以链表的随机访问的性能没有数组好,时间复杂度为O(n)

二、循环链表、双向链表和双向循环链表

将单链表的尾节点从指向空地址NULL调整为指向头结点Head,就形成了循环链表

和单链表相比,循环链表的优点是从链尾到链头比较方便。当要处理的数据具有环型结构特点时,就特别适合采用循环链表。

双向链表支持两个方向,每个节点不止只有一个后继指针或者引用Next指向后继节点,还有一个前驱指针或者引用Prev指向前面的节点

从双向链表的结构看,双向链表可以在O(1)的时间复杂度下找到前驱节点,基于此特性,在某些特殊的场景下,对节点的删除和插入操作,双向链表比单向链表会更高效.

上面我们说了单向链表、循环链表、双向链表,我们将循环链表和双向链表整合在一起,就形成了双向循环链表。

不过,数组和链表的对比,并不能局限于时间复杂度。而且,在实际的软件开发中,不能仅仅利用复杂度分析就决定使用哪个数据结构来存储数据,一切都要根据具体情况具体分析,合适最好。

预处理

一、预处理

编译预处理是在对源程序正式编译之前的处理,以“#”开头,如文件包含“#include”、宏定义“#define”等。预处理命令不是C语言本身的组成部分,不能直接对它进行编译。所有的预处理指令都是在编译之前完成的,不占用程序运行时间。

二、宏定义

  • 注意事项
  1. 宏名习惯采用大写,以便与普通变量区分;

  2. 宏定义不是C语句,所以不能在行尾加分号;否则,宏展开时,会将分号也算在内

  3. 在宏展开时,预处理程序仅按宏定义简单替换宏名,不做任何检查。如果有错误,只能由编译器在编译宏展开后的源程序时发现。

  4. 宏定义的位置是任意的,宏名的有效范围是从定义命令处到本模块结束。通常写在文件开头处。

  5. 宏调用时,是原样替换,不进行任何转换。

  • #define常量定义typede数据类型定义的异同点:

#define P_INT int* //在编译前执行 (原样替换)

typedef int* P_INT //在编译时执行

相同点:都是定义了一个int指针类型的别名

不同点:用#define时,P_INT a, b;相当于int* a, b;即int*a; int b;此时b不是int *,而是int

用typedef时,P_INT a, b;相当于int *a; int *b;

文件

文件操作补充

  • 文件操作的两种方式
  1. 基于文件描述符1的文件操作,无缓冲区,也称为低级文件的操作,属于底层文件系统,函数90多个。
  1. 基于文件指针的访问操作,带缓冲区,称为高级的文件操作,属于高级文件系统,也是标准C文件操作库函数, ANSI C库函数 300多个.

注意:在实操中,我使用的是fwritefread,故生成的数据文件打开后是无法正常阅读的,全是二进制数(相当于一层加密);若想正常阅读生成的数据文件,可使用fprintffscanf


  1. 文件描述符:就是数字,0,1,2分别表示标准输入,标准输出,标准出错 ↩︎

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

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

相关文章

2.9Vue创建项目(组件)的补充

1.再创建和引入vue的选择2.VsCode插件 安装Vue自己搜索最新的3.style自己的作用域在一个组件中引入另一个文件的子组件,给当前组件设置样式,那么子组件的样式也会改变的。为了解决这个问题 我们在自己的style中设置一个属性4.另一种创建vue 的方式(主流…

算法高频题

刷题:LeetCode(Top 100-150题,至少刷两遍)。重点:链表、树、二分查找、动态规划、回溯、栈/队列。 每一个题型,前10个高频题 算法思考框架参考:算法题思维框架-CSDN博客 高频顺序参考网站&…

服务器安装 LDOPE(MODIS 数据处理工具)

目录下载方式1-(简单快捷)根据WRF-VPRM 需要打补丁下载方式2:(手动安装依赖)一、安装所需依赖库(4 个主库 2 个基础库)另- HDF-EOS 手动编译二、解压并安装 LDOPE参考下载方式1-(简…

克隆代币 + 捆绑开盘:多链环境下的低成本发币玩法

在加密世界,发币已经不再是“少数开发者的专利”。随着工具的普及,任何人都可以快速发行一个在加密世界,发币已经不再是“少数开发者的专利”。随着工具的普及,任何人都可以快速发行一个代币。但问题是:如何在保证低成…

数据结构中的 二叉树

1.前言 在 Java 中,树(Tree)是一种非线性数据结构,由节点(Node)组成,常见的线性表则是我们之前学过的顺序表、链表、栈、队列等等。每个节点包含数据和指向子节点的引用。树的常见实现方式包括二…

IntelliJ IDEA 启动项目时配置端口指南

🌟 一、为什么需要手动设置启动端口? 默认情况下,Spring Boot 应用会使用 8080 端口启动。但在以下场景中,我们必须自定义端口: 多个微服务同时运行,需避免端口冲突;团队协作开发,统…

spark sql之from_json函数

目录前言函数语法参数说明返回值案例案例1案例2前言 在Spark SQL中,from_json函数用于解析包含JSON字符串的列,并将其转换为Spark SQL的结构化类型(如struct、map或array) 函数语法 from_json(jsonStr, schema [, options])参数…

数据结构 之 【位图的简介】

目录 1.位图的引入 2.位图概念 3.位图的实现 3.1前提准备 3.2set 3.3reset 3.4test 4.位图的应用 1.位图的引入 给40亿个不重复的无符号整数,没排过序 再给一个无符号整数,如何快速判断这个无符号整数是否在 这40亿个数中 首先,一个…

[iOS] ViewController 的生命周期

文章目录前言一、UIViewController 生命周期有关函数二、UIViewController 中函数的执行顺序运行结果1.present和dismiss2.push和pop三、总结前言 UIViewController 是在 iOS 开发中一个非常重要的角色,他是 view 和 model 的桥梁,通过 UIViewControlle…

第30章 零售与电商AI应用

本章将深入探讨人工智能在零售与电商领域的革命性应用。我们将从智能推荐系统、动态定价、库存管理到创新的虚拟试衣间,全面解析AI如何重塑购物体验和商业运营效率,并为每个关键技术点提供代码实战,帮助你掌握将AI应用于真实商业场景的能力。…

QT通过QModbusRtuSerialMaster读写电子秤数据实例

一、电子称常用功能:称重、清零、去皮;电子秤的通讯方式:Modbus通信、串口通信。二、QT读写电子秤软件界面如下:三、核心代码如下:.pro项目文件代码:QT core gui serialbus serialport.h头文件代码#…

sqlmap常用命令

ZZHow(ZZHow1024) 一、扫描注入点 1.GET方法,给URL: #探测该url是否存在漏洞 python sqlmap.py -u "http://192.168.10.1/sqli/Less-1/?id1"#如果我们已经知道admin这里是注入点的话,可以在其后面加个*来让sqlmap对其注入 python …

JVM如何排查OOM

当JVM(Java虚拟机)出现OOM(OutOfMemoryError)时,可以按照以下步骤和方法,用于帮助定位和解决JVM中的OOM问题1.查看异常堆栈信息查看异常堆栈信息(StackTrace)是定位问题的关键。OOM异…

存算一体芯片生态评估:从三星PIM到知存科技WTM2101

点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,注册即送-H卡级别算力,80G大显存,按量计费,灵活弹性,顶级配置,学生更享专属优惠。 引言:存算一体技术的崛起与意义 在传统冯诺…

[数据结构] 栈 · Stack

一.栈 stack 1.概念 栈 : 一种特殊的线性表 , 其只允许再固定的一段进行插入和删除元素操作 进行数据插入和删除操作的一段称为 栈顶 ; 另一端称为栈底栈中的数据元素遵循 先进后出 原则(LIFO)压栈 : 栈的插入操作叫做 进栈 或 压栈 或 入栈 , 入数据在栈顶出栈 : 栈的删除…

MySQL执行过程中如何选择最佳的执行路径

本篇文章介绍一个非常核心的数据库问题。MySQL 选择最佳执行路径(即“查询优化”)的过程是由其查询优化器(Query Optimizer) 完成的。 简单来说,优化器的目标是:在多种可能的执行方案中,选择一个…

【设计模式】从游戏角度开始了解设计模式 --- 抽象工厂模式

永远记住,你的存在是有意义的, 你很重要, 你是被爱着的, 而且你为这个世界带来了无可取代的东西。 -- 麦克西 《男孩、鼹鼠、狐狸和马》-- 从零开始了解设计模式抽象工厂模式抽象工厂模式 今天我们一起来探究抽象工厂模式&#x…

tensorflow.js 使用场景

TensorFlow.js (简称 TF.js) 是一个利用 WebGL 和 Node.js 在浏览器和服务器端进行机器学习模型训练和部署(推理)的 JavaScript 库。它的核心价值在于将机器学习的能力带入了 Web 开发者和 JavaScript 生态的领域。 其主要应用场景可以分为以下几大类: 一、在浏览器中直接进…

详解mcp以及agen架构设计与实现

文章目录1.MCP概念2.MCP服务端主要能力3.MCP技术生态4.MCP与Function call区别5.MCP生命周期6.MCP java SDK7.MCP应用场景8.基于springAIollma阿里qianwenmcp设计私有AIAgent应用实现9.AI java项目落地技术选型10.构建AI Agent四大模块11.LLM(大模型)与MCP之间关系12.A2A、MCP、…

六级第一关——下楼梯

上目录: 目录 题目描述 输入格式 输出格式 输入输出样例 说明/提示 一、DP的意义以及线性动规简介 在一个困难的嵌套决策链中,决策出最优解。 二、动态规划性质浅谈 三、子序列问题 (一)一个序列中的最长上升子序列&am…