
C语言高手修炼营
文章平均质量分 52
跟我一起成为Windows Linux下C语言的编程高手!
优惠券已抵扣
余额抵扣
还需支付
¥9.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
程序员乐逍遥
15年C/C++跨平台开发资深程序员、想跟我学编程的可以观看我精心录制的视频课程!
展开
-
SDL2基本的绘制流程与步骤
SDL2(Simple DirectMedia Layer 2)是一个跨平台的多媒体库,它为游戏开发和图形应用提供了一个简单的接口,允许程序直接访问音频、键盘、鼠标、硬件加速的渲染等功能。在 SDL2 中,屏幕绘制的流程通常涉及到窗口的创建、渲染目标的设置、图像的绘制、事件的处理等几个步骤。本文将详细阐述 SDL2 中的屏幕绘制流程,并为读者提供一个清晰的理解。原创 2025-01-17 14:35:19 · 446 阅读 · 0 评论 -
VS2022 Release调试的时候没有命中断点
如果你只有Release ,调试的时候没法命中,解决方法如下:原创 2025-01-17 14:21:05 · 231 阅读 · 0 评论 -
VS2022 中的 /MT /MTd /MD /MDd 选项
其实理解起来就是静态库和动态库的区别!静态链接(/MT和/MTd)简化了部署过程并减少了对环境的依赖,但可能导致较大的二进制文件和内存占用。动态链接(/MD和/MDd)则在部署时需要确保正确版本的运行时库DLL文件也被安装在目标系统上,但可以节省资源并便于库文件的更新和维护。原创 2024-12-24 14:35:08 · 531 阅读 · 0 评论 -
Visual Studio 2022 项目配置常用选项
手动拷贝到exe目录下。原创 2024-12-04 14:44:57 · 392 阅读 · 0 评论 -
VS2017 编译 SQLite3 动态库
1.安装 VS2017 community edition2.打开VS2017命令行工具3.安装TCL 开发库,推荐 TCL 9.0使用vs2017编译tcl:先进入 tcl9.0.0\win 目录安装安装成功:设置环境变量:进入 VS2017命令行工具 ,进入sqlite3的源码目录会成功生成可能会遇到问题,找不到 gawk命令:我电脑上有一个,直接配置到环境变量即可可能会遇到问题, 编译时报常量错误 error C2065: “zBom”: 未声明的标识符。原创 2024-10-12 15:54:47 · 418 阅读 · 0 评论 -
Windows上 minGW64 编译 libssh2库
安装之后,产生如下静态库,安装到MSYS2的 /usr/local 目录下了。编译器使用 Qt 6 自带的 minGW 11.2.0。使用CMake来编译libssh2。来编译 openssl库。里面的 minGW64。原创 2024-09-21 21:33:40 · 262 阅读 · 0 评论 -
没有那个文件或目录 #include <bits/libc-header-start.h>
Ubuntu 18.04 编译需要编译32位系统。原创 2024-09-20 11:32:32 · 148 阅读 · 0 评论 -
VSCode 搭配 Windows 下各种 C/C++ 编译器使用
Visual Studio Code(简称 VSCode)是一款由微软开发的免费、开源的代码编辑器,它支持多种编程语言,包括 C 和 C++。VSCode 提供了丰富的扩展和定制功能,使得开发者能够根据自己的需求进行个性化设置。在 Windows 环境下,搭配合适的 C/C++ 编译器,VSCode 能够成为一个强大的开发工具。本文将详细介绍如何在 Windows 系统上安装和配置 VSCode 以进行 C/C++ 开发。原创 2024-08-14 16:51:16 · 463 阅读 · 0 评论 -
C语言数组访问的 诡异写法,你可能认为语法错误!
【代码】C语言数组访问的 诡异写法,你可能认为语法错误!原创 2024-08-03 22:36:54 · 64 阅读 · 0 评论 -
一种特殊的二叉树 哈夫曼树(Huffman Tree)
哈夫曼树(Huffman Tree)是一种特殊的二叉树,它在信息编码领域有着广泛的应用,特别是在数据压缩技术中。下面我将通过图文结合的方式,详细介绍哈夫曼树的概念、构建方法以及应用场景。哈夫曼树的概念哈夫曼树是一种特殊的二叉树,由David Huffman于1952年提出。它主要用于解决数据编码问题,通过给定字符的频率来构造一棵二叉树,使得树中所有叶子节点的权重之和最小。哈夫曼树的每个叶子节点代表一个字符,而其非叶子节点则用于连接子树。原创 2024-07-03 13:43:23 · 114 阅读 · 0 评论 -
表达式二叉树的应用
表达式二叉树,顾名思义,是一种用于表示算术或逻辑表达式的二叉树。在这样的树中,叶子节点通常代表操作数(数字或变量),而非叶子节点则代表运算符。这种结构使得表达式的求值和优化变得非常直观和高效。表达式二叉树不仅是一种优雅的数据结构,更是连接数学与计算机科学的桥梁。通过本文的介绍,相信你已经对表达式二叉树有了更深入的理解。无论是从理论角度还是实践应用,掌握表达式二叉树都将为你的编程之旅增添一份独特的魅力。在未来的学习和工作中,不妨尝试将这一数据结构应用于实际问题中,体验它带来的便利与效率吧!原创 2024-07-03 09:58:48 · 100 阅读 · 0 评论 -
Windows VS2022 C语言使用 sqlite3.dll 访问 SQLite数据库
下载 sqlite3.dll 库。这两个文件获取到了即可。原创 2024-05-25 17:56:35 · 487 阅读 · 0 评论 -
C和C++头文件的作用、头文件编写规范、全局变量定义是否能定义在头文件中?
在C和C++编程中,头文件(Header files)是一种关键的概念。它们为了代码的可读性、可维护性以及可重用性起着至关重要的作用。在本文中,我们将深入探讨头文件的作用,讨论在头文件中能够编写的内容,以及讨论是否能在头文件中定义全局变量。头文件还可以用来定义宏和常量。这些宏和常量可以在整个程序中使用,提高了代码的可维护性和可读性。在C和C++中,可以在头文件中声明全局变量,但是并不推荐在头文件中定义全局变量。原创 2024-05-10 10:57:56 · 239 阅读 · 0 评论 -
深入理解C和C++的预编译头文件
预编译头文件是一种优化机制,用于加速代码的编译过程。它的核心思想是将一些频繁引用且不经常修改的标准库头文件或自定义头文件预先编译成二进制形式,以便在后续编译过程中快速加载和重用这些信息,从而节省编译时间。预编译头文件通常会包含一系列标准库头文件和项目特定的头文件。标准库头文件通常是编译器自带的,例如stdio.hstdlib.h等,而项目特定头文件则是项目中的自定义头文件,可以包含各种声明和定义。在C和C++中,开发人员经常会包含大量的头文件,其中一些可能包含大量的代码,并且很少发生更改。原创 2024-05-07 10:21:34 · 168 阅读 · 0 评论 -
搞清楚 Windows C/C++ 编程中各种编码
2000年3月17日发布的汉字编码国家标准,是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。:1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。:Unicode编码的转换格式,可变长编码,相对于Unicode更节省空间。:台湾地区繁体中文标准字符集,采用双字节编码,共收录13053个中文字,1984年实施。原创 2023-07-31 19:21:22 · 255 阅读 · 0 评论 -
25 - 散列表- 散列函数
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,散列表本质上也是一个数组,存放记录的数组叫做散列表。一个好的散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地被定为!原创 2023-07-17 21:36:01 · 351 阅读 · 0 评论 -
24 - 数组和广义表 - 二维数组
类型说明符 数组名[常量表达式][常量表达式]二维数组的列必须指定,并且数组大小一旦定义,则无法更改!原创 2023-07-17 19:07:23 · 191 阅读 · 0 评论 -
23 - 数组和广义表 - 数组
数组(array)是一种线性表的数据结构,用一组连续的内存空间,存储相同的类型数据。当数组每个元素都只带有一个下标时,称这样的数组为一维数组。下面则是定义了相关的一维数组int a[10];//说明整型数组a,有10个元素//说明实型数组b,有10个元素,实型数组a,有20个元素//说明字符数组ch,有20个元素对于数组注意以下几点:1)对于同一个数组,其所有元素的数据类型都是相同的。2)数组名的书写规则应符合标识符的书写规定。3)数组名不能与其他变量名相同。原创 2023-07-17 19:05:42 · 206 阅读 · 0 评论 -
21 - 队列 - 循环队列——队列的顺序表示和实现
队列(Queue)也是一种线性表, 但是它仅能在一端进行插入,而另一端进行删除的操作 ,插入的一端称为 队尾rear,删除的一端称为 队头front。向一个栈插入新元素又称作进队或入队, 从一个栈删除元素又称作出队或离队。显而易见,它的特性是 先进先出、后进后出。我们在实际生活中排队买东西的时候,是不是就是一种队列,遵循先到先购买的特点,如果我们以后的业务场景需要有这种排队机制,则使用队列是非常适合的!原创 2023-07-17 19:02:47 · 341 阅读 · 0 评论 -
20 - 队列 - 链队列——队列的链式表示和实现
队列(Queue)也是一种线性表, 但是它仅能在一端进行插入,而另一端进行删除的操作 ,插入的一端称为 队尾rear,删除的一端称为 队头front。向一个栈插入新元素又称作进队或入队, 从一个栈删除元素又称作出队或离队。显而易见,它的特性是 先进先出、后进后出。使用链式队列,可以动态扩容,不受数组固定容量的限制,所以链式队列要比数组队列要更加灵活!原创 2023-07-17 19:00:27 · 410 阅读 · 0 评论 -
19 - 队列 - 抽象数据类型队列的定义
定义:只能在 表的一端(队尾)进行插入,在另一端(队头)进行删除运算的线性表。逻辑结构:与线性表相同,仍为一对一关系。存储结构:用顺序队列或链队存储均可。运算规则: 先进先出(FIFO)实现方式:关键是编写入队和出队函数,具体实现依顺序队或链队的不同而不同。大家可以尝试使用ADT抽象栈的定义!原创 2023-07-17 18:58:38 · 294 阅读 · 0 评论 -
18 - 堆栈 - 二项堆
二项堆具有良好的性质。在 O(log2n)的时间内即可完成两个二项堆合并操作,所以二项堆是可合并堆,而仅仅需要O(1)的时间,二项堆即可完成插入操作 ,基于二项堆实现的优先队列和进程调度算法有着很好的时间性能。原创 2023-07-17 18:57:56 · 139 阅读 · 0 评论 -
17 - 堆栈 - 斐波那契堆
斐波那契堆的重要属性是:它是一组最小堆序树。(即根节点总是比叶小。在最小元素节点处维护一个指针。它由一组标记的节点组成。(减键操作)斐波那契堆中的树是无序的,但有根。原创 2023-07-17 18:55:42 · 166 阅读 · 0 评论 -
16 - 堆栈 - 优先级队列
利用大顶堆的特性,出队列时可以保证是优先级最高的那个元素哦!原创 2023-07-17 18:53:52 · 417 阅读 · 0 评论 -
15 - 堆栈 - 大顶堆
小顶堆的每个结点的值都大于或等于其左右孩子结点的值、用数组存放时满足arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 公式哦!原创 2023-07-17 18:52:20 · 279 阅读 · 0 评论 -
14 - 堆栈 - 小顶堆
小顶堆的每个结点的值都小于或等于其左右孩子结点的值、用数组存放时满足 arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 公式哦!原创 2023-07-17 18:50:27 · 321 阅读 · 0 评论 -
13 - 堆栈 - 堆栈的链表实现
/定义栈//指向栈顶//定义单向链表的节点//指向下一个节点的指针,可以通过它,知道下个节点的地址//定义栈//指向栈顶//创建链表头//入栈//创建动态内存链表,指针变量//链表初始化//加入一个节点//始终指向栈顶//出栈printf("栈是空的!\n");return -1;//打印节点printf("从栈顶到栈底:\n");while (p)int main()//入栈。原创 2023-07-17 18:48:38 · 160 阅读 · 0 评论 -
12 - 堆栈 - 数组实现堆栈
我们对栈的操作,实际上就是对数组的操作,由于栈只允许在栈顶进行出栈,所以使用数组的效率非常高,非常适合使用数组来实现!原创 2023-07-17 18:46:46 · 136 阅读 · 0 评论 -
11 - 堆栈 - 堆栈
在计算机系统中, 堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的。堆这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。这节课我们主要了解一些概念,我们会发现,在计算机系统中,就应用了数据结构的栈,来进行函数调用、中断切换时保存和恢复现场数据,包括在汇编指令中也提供对栈的操作,相信大家学完栈对操作系统的理解也会更加深入。原创 2023-07-17 18:45:01 · 188 阅读 · 0 评论 -
10 - 线性表的类型定义 - 队列
队列(Queue)也是一种线性表,但是它仅能在一端进行插入,而另一端进行删除的操作,插入的一端称为队尾(rear),删除的一端称为队头(front )。向一个栈插入新元素又称作进队或入队, 从一个栈删除元素又称作出队或离队。显而易见,它的特性是 先进先出、后进后出。内存结构如下图://定义队列int front;// 队头删除int rear;// 队尾插入从上面我们可以看出,队列的实现采用的是数组,同时需要设置两个变量 front 与 rear 分别记录队列前后端的下标,front。原创 2023-07-17 18:43:47 · 84 阅读 · 0 评论 -
09 - 线性表的类型定义 - 栈
栈(Stack)也是一种线性表,但是它仅能在一端进行插入和删除的操作,这一端被称为栈顶, 另一端则称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其下一个元素成为新的栈顶。如下图栈的内存结构。//定义栈int top;//指向栈顶从上面我们可以看出,顺序栈的实现采用的是数组。//定义栈int top;//指向栈顶//初始化栈//入栈else。原创 2023-07-17 18:41:38 · 192 阅读 · 0 评论 -
08 - 线性表的类型定义 - 循环双向链表
循环双向链表就是在双向链表的基础之上,头结点的Prev指向尾结点,尾结点的Next指针则指向头结点,从而形成闭环结构。//定义双向链表的节点//指向上一个节点的指针//指向下一个节点的指针//定义双向链表的节点//指向上一个节点的指针//指向下一个节点的指针//创建结点,链表,参数数字域//创建动态内存链表,指针变量//链表初始化//链表初始化//创建链表头//前置指向自己//后置也指向自己//头插法= NULL)else。原创 2023-07-17 18:38:04 · 195 阅读 · 0 评论 -
07 - 线性表的类型定义 - 循环单向链表
循环单向链表就是在普通单向链表的基础上尾节点的指针指向头节点,从而形成闭环结构。//数据成员//指向下一个节点的指针//定义单向循环链表的节点//指向下一个节点的指针,可以通过它,知道下个节点的地址//创建某个节点//创建动态内存链表,指针变量//链表初始化//创建链表头//next指向自己//头插法,插入一个节点= NULL)elseprintf("节点不存在\n");//修改节点,参数链表,修改的第n个节点printf("链表为空!\n");原创 2023-07-17 18:34:10 · 85 阅读 · 0 评论 -
06 - 线性表的类型定义 - 双链表
数据域和指针域,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点,最后一个结点的head指向为null,对单向的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始进行遍历。对于双向链表来说,它的每个节点要指向“直接前驱”和“直接后继”,所以节点类需要含有两个指针域。指向直接前驱的指针使用pre表示,指向后继的指针使用next表示。双向链表是在单向链表基础上的一个改进,每个节点指向其直接前驱和直接后继节点。因此,从双向链表的任意位置开始,都能访问所有的节点。//数据成员。原创 2023-03-21 13:17:19 · 132 阅读 · 0 评论 -
05 - 线性表的类型定义 - 链表
链表是一种物理存储单元上非连续、非顺序的存储结构,由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。//数据成员//一定不能缺的成员//指向下一个节点的指针,可以通过它,知道下个节点的地址//定义单向链表的节点//指向下一个节点的指针,可以通过它,知道下个节点的地址//创建某个节点//创建动态内存链表,指针变量//链表初始化//创建链表头//头插法,插入一个节点= NULL)elseprintf("节点不存在\n");原创 2023-03-21 13:15:16 · 248 阅读 · 0 评论 -
04 - 线性表的类型定义 - 数组
线性表是最基本、最简单、也是最常用的一种数据结构。线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。数组(array)是一种线性表的数据结构,用一组连续的内存空间,存储相同的类型数据。//元素集合int size;//元素个数//容量}SeqList;//元素集合int size;//元素个数//容量}SeqList;//初始化表//初始容量\n");//添加一个元素{ // 判断表中元素是否已满\n");return;// 添加元素e。原创 2023-03-21 11:27:45 · 142 阅读 · 0 评论 -
03- 算法和算法分析 - 算法的存储空间需求
算法对空间的需求是可以进行优化的、我们需要权衡算法与空间的平衡性,以时间换空间,或者以空间换时间,都需要在具体算法场景中来综合考虑。原创 2023-03-21 11:25:40 · 739 阅读 · 0 评论 -
02- 算法和算法分析 - 算法效率的度量
对于一个算法, 时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间 ,以“用空间换时间”;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。原创 2023-03-21 13:15:32 · 488 阅读 · 0 评论 -
01- 算法和算法分析 - 算法设计的要求
很高兴大家能够阅读本套课程内容,从本节开始我们将系统性的学习数据结构相关的知识。当然,数据结构和算法是密切相关,本单元我们就来聊一聊算法和算法分析的问题。本节我们先说算法的设计的要求。原创 2023-03-21 11:25:35 · 290 阅读 · 0 评论 -
使用C语言模仿Linux 终端命令行ls cd cat touch pwd命令
等进一步完善了再贴代码,欢迎和老师一起交流 ,微 cxynmw。还自创了一个命令append 用于给文件添加内容。原创 2022-11-04 20:58:10 · 822 阅读 · 0 评论