- 博客(15)
- 收藏
- 关注
原创 TOP-K问题
【摘要】本文介绍了top-k问题的解决方案,重点阐述了基于堆结构的实现方法。通过建立大小为k的小顶堆,依次比较数据源元素与堆顶元素,保留最大的k个元素。该方法时间复杂度为O(N),空间复杂度为O(K)。文中还提供了C语言实现代码,包括随机数生成、文件读写、堆操作等核心功能,并展示了如何利用小顶堆查找文件中最大的k个数值。该方案适用于各类需要获取极值数据的应用场景。
2025-12-18 17:39:11
321
原创 堆排序的实现
本文详细讲解了堆排序的实现原理和优化方法。首先分析了向上调整和向下调整两种建堆方式的时间复杂度差异,证明向下调整算法(O(N))比向上调整(O(NlogN))更高效。然后阐述了堆排序的核心思想:升序建大堆,降序建小堆,通过不断交换堆顶元素和末尾元素并调整堆结构来完成排序。文中提供了完整的C语言实现代码,包括堆的初始化、调整、排序等核心函数,并展示了如何将数组转化为堆结构进行排序。此外还介绍了利用堆结构解决TopK问题的应用实例。
2025-12-18 16:39:52
833
7
原创 堆的实现与操作详解
本文介绍了堆数据结构的概念与实现。堆是一种完全二叉树,可以使用数组存储,通过父子节点索引关系实现高效操作。文章详细讲解了向上调整(从子节点到父节点)和向下调整(从父节点到子节点)两种核心算法,分别用于插入和删除元素时维护堆的有序性。在功能实现方面,提供了堆的创建、销毁、插入(push)和删除(pop)等操作的代码实现,其中插入操作使用向上调整算法,删除操作使用向下调整算法。所有操作都保证了堆的性质不受破坏,且时间复杂度保持在O(log n)级别。
2025-12-15 22:23:33
993
1
原创 设计循环队列
本文介绍了循环队列的设计实现方案。通过分析链表和数组两种实现方式的优劣,最终选择使用数组实现循环队列。关键点包括:1)使用_head和_tail指针标记队列首尾;2)通过多分配一个空间来区分队列满和空的状态;3)利用取模运算处理指针回转问题。文中详细说明了初始化、判空判满、获取首尾元素以及入队出队等核心操作的实现逻辑,并给出了完整的C++代码实现。这种设计保证了循环队列的高效操作,时间复杂度均为O(1)。
2025-12-15 20:11:07
988
3
原创 链表的终极考验:随机链表的复制
本文讲解LeetCode"复制带随机指针的链表"问题。该问题要求深拷贝一个包含next和random指针的链表,难点在于如何正确复制random指针。作者提出创新解法:1.在原链表每个节点后插入其复制节点;2.通过原节点的random指针定位复制节点的random指针;3.分离两个链表。这种方法时间复杂度O(n),空间复杂度O(1),巧妙地利用原链表建立映射关系,避免了额外空间开销。代码实现包含创建复制节点、设置random指针和分离链表三个主要步骤,并处理了边界条件。
2025-12-13 19:52:35
1286
3
原创 数据结构:队列(C++含量更多)
本文介绍了一个基于C++实现的队列数据结构(QT),相比C版本有以下改进:1) 使用类封装成员变量和方法,避免重复传参;2) 内置构造函数和析构函数自动处理初始化和清理;3) 支持多个实例独立操作。队列核心功能包括:入队(push)、出队(pop)、获取头尾元素(front/tail)以及展示全部元素(display)。实现采用链表结构,使用malloc分配节点内存,特别注意出队操作中需要正确处理指针关系防止越界访问。示例代码展示了基本使用方法,包括创建队列、入队、出队和元素访问等操作。
2025-12-12 16:06:13
461
1
原创 数据结构:栈的实现(C++)
本文介绍了栈数据结构的基本概念和C++实现。栈遵循先进后出原则,支持压栈和出栈操作。文章详细说明了使用数组实现栈的优势,并提供了一个基于类的实现方案,包含构造函数、析构函数以及核心操作函数(STPush、STPop、STTop等)。实现中考虑了动态扩容机制,当栈满时自动增加容量。示例代码演示了栈的基本操作流程,包括压栈、查看栈顶元素和出栈操作。该实现通过类封装保证了数据安全性,使用动态内存管理避免内存泄漏,展现了栈数据结构在C++中的典型实现方式。
2025-12-11 20:13:01
488
原创 数据结构:队列(C++)
本文介绍了使用链表实现队列数据结构的方法。队列具有先进先出(FIFO)特性,相比数组实现,链表能更灵活地处理元素的添加和删除操作。文章详细说明了队列的节点和结构体设计,包括初始化、添加元素、删除元素、获取大小、访问首尾元素等核心功能的实现。通过typedef定义节点数据类型提高代码复用性,并提供了完整的使用示例。该实现避免了数组方式的空间浪费问题,更适合队列的动态操作需求。
2025-12-11 19:24:19
482
原创 C语言中的动态内存管理
最好不要在函数中使用malloc为一个指针变量申请空间,因为函数的内容是在栈空间中的,在出函数时会直接销毁,如果在主函数中使用在函数中申请的指针变量就会找不到对应的空间。在C语言中,使用malloc函数申请的空间是不会自动释放的,我们一定要在使用malloc申请空间后再使用free释放。包含柔性数组成员的结构⽤malloc ()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤。有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的使。
2025-12-02 22:42:25
1155
原创 整数和浮点数在内存中的存储
还有一件事:在浮点数的储存中,在2的零次之后的二进制位都是有权重的,所以我们就可以使用这些二进制位来凑齐小数点后的数字。例如:在16进制数字0x11223344中最高位的1的权重就是16的7次方,而最低位的4的权重就是16的0次方。对于64位的浮点数(double),最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。对于32位的浮点数(float),最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。⼀个中间数,对于8位的E,这个中间数是127;
2025-11-29 16:37:15
1207
原创 fopen_s函数的一些基本的使用
我刚刚做了一个需要使用到文件操作和链表的小项目,也踩了不少坑,现在对文件操作也有了新的认知,现在分享给大家。##返回值当打开失败时,返回errno_t类型的错误代码(该错误代码是可以被解析的)当打开成功时,返回值是0,pFile变为一个有效内存地址(相当于是文件的一个代理指针),以后再对文件中的内容进行操作的时候就用这个指针。其中,Pfile就是FILE*类型的变量的指针。filename就是文件名。mode就是打开方式,以下是常用的打开方式:发现了没有,当我们想在不改变文件中的数据的情况下将文
2025-11-29 10:58:16
528
原创 fopen_s和strtok_s函数中FILE**类型参数详解
fopen_s是 C11 标准中引入的安全版本的文件打开函数,用于替代不安全的fopen函数。strtok_s是 C11 标准中引入的安全版本的字符串分割函数,用于替代不安全的strtok函数。我在初识这两个函数时,在使用时总是传错参数,故细细研究,出此博文,望对大家有所帮助。
2025-11-27 17:19:59
337
原创 简易学生成绩管理系统
本文介绍了一个基于C语言的多级菜单学生管理系统实现方案。系统采用链表存储学生信息(学号、姓名、成绩),实现了录入、查询、删除和排序功能。关键技术包括:1) 使用链表结构动态管理数据;2) 采用qsort实现成绩排序;3) 通过文件操作实现数据持久化;4) 使用sscanf_s进行输入合法性验证。系统具有完整的多级菜单交互界面,支持数据重复检测和错误输入提示。该方案充分考虑了内存管理、数据完整性和用户体验,可作为学生信息管理的基础框架。
2025-11-26 17:56:51
1312
原创 二进制和二进制的转换以及左移右移操作符
本文介绍了二进制的基础知识及其在计算机中的应用。首先阐述了二进制的表示方法,包括正负数的原码、反码和补码转换,说明变量在内存中以补码形式存储。其次讲解了二进制与八进制、十六进制的转换关系及表示方法。最后详细解释了左移和右移操作符的工作原理:左移实现乘二效果,右移分为算术右移(保留符号位)和逻辑右移(补零),具体取决于编译器实现(如VS2022采用算术右移)。全文系统性地梳理了二进制的基本概念、转换方法和移位运算规则。
2025-11-13 23:00:09
295
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅