
数据结构初阶(C)【learning】
文章平均质量分 71
C语言实现初阶数据结构
graceyun
低头赶路,敬事如仪,自知其心,其路则明~
展开
-
初阶数据结构(C语言实现)——6.2选择排序详解(思路图解+代码实现)
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序分为两类: 1.直接选择排序 2.堆排序。原创 2025-03-24 20:24:38 · 980 阅读 · 0 评论 -
初阶数据结构习题【16】(5二叉树)——144. 二叉树的前序遍历
示例 1:输入:root = [1,null,2,3]输出:[1,2,3]解释:示例 2:输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]输出:[1,2,4,5,6,7,3,8,9]解释:示例 3:输入:root = []输出:[]示例 4:输入:root = [1]输出:[1]原创 2025-03-24 19:55:23 · 282 阅读 · 0 评论 -
初阶数据结构(C语言实现)——1数据结构前言
算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。原创 2025-02-24 17:59:49 · 184 阅读 · 0 评论 -
初阶数据结构(C语言实现)——2算法的时间复杂度和空间复杂度
时间复杂度的定义:在计算机科学中**,算法的时间复杂度是一个函数**,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。内存的申请就像是住酒店一样,你申请了一块空间相当于开了一间房,然后你使用完,就退房了,钥匙给酒店前台了(OS)。示例2分析:时间复杂度为 O(logN) (logN在算法分析中表示是底数为2,对数为N。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。原创 2025-02-26 19:53:15 · 1348 阅读 · 0 评论 -
初阶数据结构(C语言实现)——3.1顺序表详解(初始化、增、删、查、改)
静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。验证插入4个元素,删掉1个元素。原创 2025-02-27 19:38:46 · 1391 阅读 · 0 评论 -
初阶数据结构(C语言实现)——3.2数组相关面试题
为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。然后返回 nums 中唯一元素的个数。思路1:另外开辟一个数组,src从头往后遍历,遇到不是要删除元素,就把该元素赋值给数组,直到遍历完整个数组,在最后再把数组赋值到原数组。原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。原创 2025-02-27 20:22:23 · 1038 阅读 · 0 评论 -
初阶数据结构(C语言实现)——3.3单向非循环链表详解(定义、增、删、查、改)+链表面试题
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的链表的物理结构1.从上图可看出,链式结构在逻辑上是连续的,但是在物理上不一定连续2.现实中的结点一般都是从堆上申请出来的3.从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续。原创 2025-02-28 17:47:31 · 1175 阅读 · 0 评论 -
初阶数据结构(C语言实现)——3.4带头双向循环链表详解(定义、增、删、查、改)
学习带头双向循环链表之前,建议先学习下顺序表,和单向不带头不循环链表。这是博主之前的文章,欢迎学习交流。原创 2025-03-07 20:18:32 · 1339 阅读 · 0 评论 -
初阶数据结构(C语言实现)——4.1栈
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。在VS2022中新建一个工程。原创 2025-03-08 19:00:00 · 902 阅读 · 0 评论 -
初阶数据结构(C语言实现)——4.2队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。Queue20250310.h(队列的类型定义、接口函数声明、引用的头文件)Queue20250310.c(队列的接口函数的实现)原创 2025-03-10 18:48:01 · 595 阅读 · 0 评论 -
初阶数据结构(C语言实现)——5.1二叉树基础概念
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。而现实中使用中只有堆才会使用数组来存储。为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。原创 2025-03-12 19:00:00 · 1100 阅读 · 0 评论 -
初阶数据结构(C语言实现)——5.2 二叉树的顺序结构及堆的实现
普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。左图就是完全二叉树的数组存储右图是非完全二叉树的数组顺序存储,会造成浪费。原创 2025-03-13 19:00:00 · 2275 阅读 · 0 评论 -
初阶数据结构(C语言实现)——5.3 堆的应用(1)——堆排序
学习堆的应用之前,欢迎学习下堆。这是博主之前的文章,欢迎学习交流。原创 2025-03-13 19:27:08 · 750 阅读 · 0 评论 -
初阶数据结构(C语言实现)——5.5 二叉树的链式结构的实现
学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为。根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。原创 2025-03-17 20:27:48 · 566 阅读 · 0 评论 -
初阶数据结构(C语言实现)——6排序概述
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[ i ]=r[ j ],且r[ i ]在r[ j ]之前,而在排序后的序列中,r[ i ]仍在r[ j ]之前,则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。原创 2025-03-20 20:32:29 · 985 阅读 · 0 评论 -
初阶数据结构(C语言实现)——6.1插入排序详解(思路图解+代码实现)
直接插入排序是一种简单的插入排序法,其基本思想是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。实际中我们玩扑克牌时,就用了插入排序的思想。接牌的时候,第一张牌我们直接拿手里,然后第二张牌就会按我们的习惯,左边小,右边大,(或者左边大,右边小)去放牌。这就是插入排序的思想。插入排序主要分为直接插入排序和希尔排序,后面分别先介绍两类排序算法思想,然后紧跟代码实现。原创 2025-03-21 19:30:00 · 1124 阅读 · 0 评论 -
初阶数据结构习题【18】(5二叉树)——572. 另一棵树的子树
前置。原创 2025-03-18 19:20:02 · 149 阅读 · 0 评论 -
初阶数据结构习题【17】(5二叉树)——100. 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入:p = [1,2,3], q = [1,2,3]输出:true示例 2:输入:p = [1,2], q = [1,null,2]输出:false示例 3:输入:p = [1,2,1], q = [1,1,2]输出:false。原创 2025-03-18 19:17:40 · 200 阅读 · 0 评论 -
初阶数据结构习题【16】(5二叉树)——965. 单值二叉树
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。示例 1:输入:[1,1,1,1,1,null,1]输出:true示例 2:输入:[2,2,2,5,2]输出:false。原创 2025-03-17 20:40:13 · 271 阅读 · 0 评论 -
初阶数据结构习题【16】(4栈和队列)——622. 设计循环队列
设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。示例:// 设置长度为 3// 返回 true// 返回 true// 返回 true// 返回 false,队列已满// 返回 3。原创 2025-03-20 21:36:51 · 342 阅读 · 0 评论 -
初阶数据结构习题【15】(4栈和队列)——232. 用栈实现队列
可以看看博主之前的这篇文章,关联性比较大。原创 2025-03-14 17:30:00 · 613 阅读 · 0 评论 -
初阶数据结构习题【14】(4栈和队列)——225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。注意:你只能使用队列的标准操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。你所使用的语言也许不支持队列。你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可示例:输入:输出:解释:// 返回 2// 返回 2。原创 2025-03-10 19:51:11 · 488 阅读 · 0 评论 -
初阶数据结构习题【13】(4栈和队列)——括号匹配问题。
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false示例 4:输入:s = “([])”输出:true。原创 2025-03-08 19:00:00 · 256 阅读 · 0 评论 -
初阶数据结构习题【12】(3顺序表和链表)——138.随机表的复制
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y。原创 2025-03-14 17:30:00 · 248 阅读 · 0 评论 -
初阶数据结构习题【11】(3顺序表和链表)——142. 环形链表 II
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。示例 1:输入:head = [3,2,0,-4], pos = 1。原创 2025-03-07 20:18:45 · 453 阅读 · 0 评论 -
初阶数据结构习题【11】(3顺序表和链表)——141. 环形链表I
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表示例 1输入:head = [3,2,0,-4], pos = 1。原创 2025-03-06 20:12:15 · 1008 阅读 · 0 评论 -
初阶数据结构习题【10】(3顺序表和链表)——160. 相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。图示两个链表在节点 c1 开始相交题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3输出:Intersected at ‘8’原创 2025-03-06 20:12:04 · 390 阅读 · 0 评论 -
初阶数据结构习题【9】(3顺序表和链表)——OR36 链表的回文结构
描述对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:1->2->2->1返回:true。原创 2025-03-05 18:56:43 · 294 阅读 · 0 评论 -
初阶数据结构习题【8】(3顺序表和链表)——CM11 链表分割
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。原创 2025-03-04 18:11:44 · 515 阅读 · 0 评论 -
初阶数据结构习题【7】(3顺序表和链表)—— 21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]原创 2025-03-03 18:13:30 · 499 阅读 · 0 评论 -
初阶数据结构习题【6】(3顺序表和链表)—— 206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例2输入:head = [1,2]输出:[2,1]示例3输入:head = []输出:[]原创 2025-03-03 18:13:38 · 248 阅读 · 0 评论 -
初阶数据结构习题【5】(3顺序表和链表)——面试题 02.02. 返回倒数第 k 个节点
输入一个链表,输出该链表中倒数第k个结点实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。示例:输入: 1->2->3->4->5 和 k = 2输出: 4。原创 2025-03-01 14:58:12 · 159 阅读 · 0 评论 -
初阶数据结构习题【4】(3顺序表和链表)——876 链表的中间结点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点示例 1:输入:head = [1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为 3。示例 2:输入:head = [1,2,3,4,5,6]输出:[4,5,6]解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。原创 2025-03-01 14:29:44 · 322 阅读 · 0 评论 -
初阶数据结构习题【3】(1时间和空间复杂度)——203移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。示例1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [ ], val = 1输出:[ ]示例 3:输入:head = [7,7,7,7], val = 7输出:[ ]原创 2025-02-28 23:58:03 · 374 阅读 · 0 评论 -
初阶数据结构习题【2】(1时间和空间复杂度)——189. 轮转数组
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。之前C语言学习阶段做过类似的题目(示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]示例2输入:nums = [-1,-100,3,99], k = 2。原创 2025-02-26 19:53:36 · 368 阅读 · 0 评论 -
初阶数据结构习题【1】(2时间复杂度)——消失的数字
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?原创 2025-02-25 19:09:58 · 215 阅读 · 0 评论