
C语言数据结构
文章平均质量分 87
本专栏围绕 C 语言数据结构展开,系统讲解数组、链表、栈、队列、树等经典数据结构,结合代码示例剖析实现原理,助读者掌握数据组织与操作技巧,提升算法设计能力,夯实 C 语言编程核心知识。
南玖yy
专栏有更系统的学习哦(从下往上)
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
排序算法复杂度及稳定性全解析(八种排序)
不同的排序算法各有优劣,在实际应用中,需要根据具体场景选择合适的排序算法。若数据规模较小,直接插入排序、冒泡排序等简单算法可能更合适;对于大规模数据,归并排序、快速排序等平均性能较好的算法更受青睐;而当数据取值范围有限时,计数排序能展现出极高的效率。理解排序算法的复杂度和稳定性,有助于我们编写出更高效、可靠的程序。原创 2025-04-15 18:05:48 · 1179 阅读 · 0 评论 -
快速排序(非递归版本)
它采用分治法的思想,通过选择基准元素将数组分为两部分,递归地对左右两部分进行排序。然而,递归实现的快速排序在处理大规模数据时可能会导致栈溢出的问题。为了解决这个问题,我们可以使用非递归的方式来实现快速排序。快速排序的基本思想是选择一个基准元素,将数组分为两部分,使得左边部分的所有元素都小于等于基准元素,右边部分的所有元素都大于等于基准元素。递归实现的快速排序使用系统栈来保存每一层递归调用的状态。而非递归实现则使用自定义的栈来模拟递归调用的过程,避免了系统栈溢出的问题。非递归快速排序的核心是使用自定义的。原创 2025-04-14 18:51:57 · 418 阅读 · 0 评论 -
【保姆级图解】交换排序 算法详解:直接冒泡排序、快速排序
选择基准:从待排序数组中选择一个元素作为基准(pivot)。分区操作:将数组分为两部分,使得左边部分的所有元素都小于等于基准,右边部分的所有元素都大于等于基准。递归排序:分别对左右两部分递归地进行快速排序。前后指针法是实现分区操作的一种有效方式。前后指针法是快速排序中一种简洁而有效的分区实现方式。它通过两个指针的移动和交换操作,将数组分为两部分,使得基准元素处于其最终的正确位置。虽然快速排序在平均情况下具有出色的性能,但在最坏情况下可能会出现性能退化的问题。原创 2025-04-15 02:12:50 · 1420 阅读 · 0 评论 -
【保姆级图解】选择排序 算法详解:直接选择排序、堆排序
直接选择排序:实现简单,但效率较低,适用于对稳定性无要求的小数据。堆排序:高效的大数据排序算法,但存在不稳定性和缓存不友好问题。实际应用中,需根据数据规模、有序性及稳定性需求选择合适的算法。例如,快速排序结合插入排序的混合方案(如Introsort)能兼顾不同场景的效率。原创 2025-04-15 02:14:14 · 361 阅读 · 0 评论 -
【保姆级图解】插入排序 算法详解:直接插入排序、希尔排序
直接插入排序:简单稳定,适合小数据或部分有序场景。希尔排序:插入排序的高效改进,适合中等规模数据。理解基础排序算法的实现有助于掌握更复杂的排序技术,实际应用中可根据数据特征选择合适的算法。原创 2025-04-10 13:51:14 · 1323 阅读 · 0 评论 -
数据结构C语言练习(二叉树)
二叉树的前序遍历,遵循 “根 - 左 - 右” 的访问顺序。即先访问根节点,接着访问左子树,最后访问右子树。例如,对于一棵简单二叉树,根节点值为5,左子节点值为3,右子节点值为7,其前序遍历结果就是。这种遍历方式在诸如二叉树初始化、计算节点属性等众多场景中广泛应用。代码开头定义了二叉树节点的结构体TreeNode,其中val用于存储节点的值,left和right分别是指向左子节点和右子节点的指针。typedef操作简化了后续代码中对该结构体的引用。二叉树的前序遍历是二叉树相关算法的基础内容。原创 2025-04-06 03:30:00 · 1576 阅读 · 1 评论 -
【保姆级图解】二叉树操作详解:构建、遍历、统计与完全二叉树判断
构建、销毁、统计等操作均依赖递归分解问题。原创 2025-04-05 04:36:44 · 1340 阅读 · 3 评论 -
【保姆级图解】堆排序算法详解:代码逐函数解析
堆排序通过AdjustDown调整堆结构,结合HeapSort组织建堆与排序流程,实现 \(O(n \log n)\) 时间复杂度的高效排序。理解这些函数,不仅能掌握堆排序原理,也为学习堆的其他应用(如优先队列)提供基础。原创 2025-04-03 11:42:08 · 669 阅读 · 3 评论 -
【保姆级图解】堆(大小堆)数据结构从概念到代码实现:手把手解析初始化、插入、删除及核心调整算法(含完整 C 语言代码与测试用例)
完全二叉树:用数组存储,下标计算父子节点(左子2i+1,右子2i+2,父节点(i-1)/2大堆性质:通过AdjustUp和AdjustDown维持 “父节点≥子节点”,确保堆顶为最大值。原创 2025-04-01 01:12:44 · 1625 阅读 · 0 评论 -
二叉树深度剖析:从理论到实践
若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h - 1) 的节点数都达到最大个数,第 h 层所有的节点都连续集中在最左边,这就是完全二叉树。通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址。二叉树是一种特殊的树,它的每个节点最多有两个子节点,分别称为左子节点和右子节点。:以某结点为根的⼦树中任⼀结点都称为该结点的⼦孙。:⼀个结点有⼏个孩⼦,他的度就是多少;:⼀个结点含有的⼦树的根结点称为该结点的⼦结点;原创 2025-04-04 02:24:25 · 630 阅读 · 0 评论 -
数据结构C语言练习(设计循环队列)
循环队列通过巧妙的指针和取模运算,解决了普通队列的空间浪费问题。利用k+1空间区分空满状态。所有指针移动操作都需配合取模运算,确保循环逻辑正确。每个操作前先进行空 / 满判断,保证程序健壮性。通过上述函数实现,可完整支持循环队列的创建、插入、删除、查询等核心操作,满足题目要求。原创 2025-04-03 00:32:41 · 1139 阅读 · 0 评论 -
数据结构C语言练习(两个栈实现队列)
int _top;} Stack;} MyQueue;Stack结构体表示栈,包含存储数据的数组_a、栈顶指针_top和容量_capacity。MyQueue结构体包含两个栈pushST和popST,用于实现队列功能。通过两个栈的巧妙配合,我们成功地实现了队列的功能。这种实现方式不仅加深了我们对栈和队列特性的理解,还展示了如何通过组合数据结构来解决实际问题。在实际编程中,灵活运用数据结构的特性可以让我们更高效地解决各种问题。希望本文的解析能帮助读者更好地掌握这一经典实现方法。原创 2025-04-02 00:07:52 · 925 阅读 · 0 评论 -
数据结构C语言练习(两个队列实现栈)
在开始实现栈操作之前,我们需要定义队列和栈的数据结构。} Queue;Queue q1;Queue q2;} MyStack;QListNode是队列的节点结构,包含一个指向下一个节点的指针_next和存储的数据_data。Queue结构体包含两个指针,_front指向队列的头节点,_rear指向队列的尾节点。MyStack结构体包含两个队列q1和q2,我们将通过这两个队列来模拟栈的操作。通过使用两个队列,我们成功地模拟了栈的基本操作。原创 2025-04-01 22:29:19 · 1204 阅读 · 0 评论 -
深入理解栈与链式队列:从动态数组到链表实现详解
通过上述代码,我们实现了一个基于链式结构的队列,并且对队列的各项操作函数进行了详细的实现和测试。在实际应用中,队列可以用来解决很多问题,例如任务调度、消息处理等。掌握队列的基本操作和实现原理,对于学习数据结构和算法是非常有帮助的。希望本文能帮助你更好地理解链式队列的实现和应用。如果你有任何疑问或者建议,欢迎在评论区留言。附上代码Queue.h// 链式结构:表示队列}QListNode;// 队列的结构//int size;//队列中有效数据个数}Queue;// 初始化队列。原创 2025-03-27 23:28:01 · 1399 阅读 · 0 评论 -
数据结构C语言练习(栈)
通过实现动态栈,我们高效解决了括号匹配问题。栈的 “后进先出” 特性完美契合括号匹配逻辑:左括号入栈,右括号与栈顶匹配。这一思路可扩展到更多需要匹配关系的场景(如标签匹配、表达式校验等)。理解栈的底层实现,能更灵活地应用这一数据结构解决实际问题。原创 2025-04-01 21:34:05 · 541 阅读 · 0 评论 -
用C语言实现动态增长的栈:从原理到代码详解
/ 动态数组存储元素int _top;// 栈顶指针(指向下一个空闲位置)// 当前容量} Stack;_a:动态数组指针,存放栈元素。_top:栈顶指针,初始为0。当插入一个元素时,_top指向下一个空闲位置。_capacity:数组的当前容量,动态调整以支持栈的扩容。动态扩容:避免固定容量的限制。高效操作:入栈、出栈均摊时间复杂度为O(1)。原创 2025-03-27 21:37:45 · 1057 阅读 · 0 评论 -
数据结构C语言练习(单双链表)
给定一个链表的头节点head和一个整数val,需要删除链表中所有满足的节点,并返回新的头节点。例如,输入链表val=6,输出。本文通过构建新链表的方法解决了 “移除链表元素” 问题。该思路通过遍历原链表,有选择性地构建新链表,避免了复杂的节点删除操作。理解这种解题方式,有助于加深对链表操作的理解,在处理类似链表修改问题时提供新思路。迭代法反转链表通过三个指针的配合,在遍历链表过程中完成指针反转,逻辑清晰且效率高。原创 2025-03-28 10:49:47 · 975 阅读 · 0 评论 -
深入剖析带头循环双向链表的实现与应用
LTNode;节点结构data:存储节点数据next:指向下一个节点prev:指向前一个节点循环特性头节点的next指向第一个有效节点头节点的prev指向最后一个节点形成闭环结构(头节点自环表示空链表)技术点说明头节点设计简化边界条件处理,统一头插尾插操作循环链表特性通过头节点的 prev 指针快速访问尾节点指针操作技巧插入需修改 4 个指针,删除需修改 2 个指针内存管理使用LTBuyNode统一分配内存,LTDesTroy彻底释放内存安全性设计assert。原创 2025-03-27 00:00:18 · 1078 阅读 · 5 评论 -
深入理解单链表:C语言实现与操作全解析
/ 数据域// 指针域} SLTNode;核心说明data:存储整型数据(可自定义为其他类型)。next:指向下一个节点的指针,用于连接链表中的各个节点,形成链式结构。原创 2025-03-23 19:04:36 · 1206 阅读 · 5 评论 -
数据结构C语言练习(顺序表)
可点击上面链接先做思路:方法1:暴力移除(双循环移动元素)1. 从前往后遍历nums,找到val第一次出现的位置2. 将val之后的所有元素整体往前搬移,即删除该val3. nums中有效元素个数减少一个循环进行上述操作,直到nums中所有值为val的元素全部删除完 时间复杂度:O(N^2) 空间复杂度:O(1)方法2:临时数组辅助1. 创建一个长度与nums相同的数组temp2. 遍历nums,将nums中所有与val不原创 2025-03-22 01:48:46 · 1424 阅读 · 0 评论 -
动态顺序表实战指南:让你的代码更高效
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构。本代码实现了一个动态顺序表,支持自动扩容和各种基本操作。相较于静态顺序表,动态版本在空间不足时会自动扩容,更灵活高效。// 动态数组int size;// 有效数据个数// 总容量} SL;类型定义SLDataType:将int类型重命名为SLDataType,方便后续修改顺序表存储的数据类型。SL:定义了顺序表的结构体,包含三个成员:arr:指向存储数据的动态数组的指针。size:表示当前顺序表中有效数据的个数。原创 2025-03-21 20:38:38 · 1128 阅读 · 0 评论 -
数据结构完全指南:C语言实现与核心原理剖析
在程序设计实践中,没有绝对的最优数据结构,只有最适合场景的选择。理解各个结构的底层原理和性能特征,根据具体需求在时间效率、空间消耗和实现复杂度之间做出权衡,才是优秀程序员的必修课。建议通过LeetCode等平台进行实战训练,在解决实际问题的过程中深化对数据结构的理解。原创 2025-03-12 22:17:25 · 561 阅读 · 0 评论 -
数据结构与算法效率分析:时间复杂度与空间复杂度详解(C语言)
空间复杂度衡量算法运行过程中临时占用的存储空间大小,同样使用大O表示法。包括:局部变量占用的空间递归调用的栈空间复杂度类型增长趋势典型算法O(1)常数级哈希查找O(n)线性增长顺序查找O(n²)平方级增长冒泡排序O(n³)立方级增长矩阵乘法(朴素)O(2ⁿ)指数爆炸递归求斐波那契数列O(log n)对数增长二分查找O(n log n)线性对数增长快速排序。原创 2025-03-11 22:59:36 · 696 阅读 · 0 评论