自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 C++数据结构深度探索:哈希表的实现与优化

本文系统介绍了哈希技术及其衍生数据结构。首先阐述了哈希表的基本概念,包括直接定址法、哈希冲突和负载因子,详细分析了三种哈希函数(除法散列、乘法散列、全域散列)和两种冲突处理方法(开放定址法和链地址法),并提供了完整的C++实现代码。随后讲解了位图的设计原理和应用场景,如海量数据查找和统计。最后介绍了布隆过滤器,说明其通过多哈希函数降低误判率的机制,并给出实现代码。全文深入浅出地讲解了这些高效数据结构的工作原理和实际应用,为处理大规模数据问题提供了实用解决方案。

2025-12-01 19:46:49 926

原创 C++红黑树:理论与实践相结合的平衡艺术

红黑树是一种自平衡二叉搜索树,通过节点颜色约束(红/黑)和旋转操作维持平衡。其核心规则包括:根节点为黑、红色节点不能连续、任意路径黑节点数相同。这些规则确保最长路径不超过最短路径的两倍,保证操作效率为O(logN)。实现时,插入操作需处理三种情况(变色、单旋+变色、双旋+变色)以维持平衡。验证红黑树需检查四点规则是否满足。完整代码实现了插入、查找、旋转等核心功能,并通过递归验证树的平衡性。

2025-12-01 12:29:50 780

原创 C++数据结构:AVL树的插入、旋转与平衡全过程

AVL树是一种自平衡二叉搜索树,其核心特点是保持任意节点的左右子树高度差不超过1。本文详细介绍了AVL树的概念、结构实现和关键操作:插入节点时的平衡因子更新机制,以及四种旋转操作(右单旋、左单旋、左右双旋、右左双旋)的实现原理与具体代码。文章还包含了AVL树的查找功能和平衡检测方法,通过高度差验证树的平衡性。完整代码实现了AVL树的核心功能,包括节点插入、旋转调整和平衡检查。AVL树通过严格的平衡控制,确保操作时间复杂度为O(logN),为后续学习红黑树等高级数据结构奠定基础。

2025-11-09 14:51:46 3043

原创 C++数据结构实战:二叉搜索树的核心操作与应用场景

本文详细介绍了二叉搜索树(BST)的概念、基本操作和典型应用。BST是一种具有特定排序性质的二叉树结构,左子树节点值小于等于根节点,右子树节点值大于等于根节点。文章分析了BST的最优和最差性能情况,并详细讲解了插入、查找和删除操作的实现方法,其中删除操作根据四种不同情况采用不同的处理策略。通过C++代码示例展示了key-only和key-value两种模型的实现,前者适用于存在性检查场景(如车牌识别),后者适用于键值映射场景(如词频统计)。文章指出BST在极端情况下会退化为线性结构,这为后续学习更高效的平衡

2025-11-09 14:32:30 2809

原创 深入理解C++多态:从虚函数到动态绑定

本文详细介绍了C++多态的概念与实现机制。多态分为编译时多态(函数重载/模板)和运行时多态(虚函数),重点阐述了运行时多态的实现条件:基类指针/引用调用虚函数,且派生类完成虚函数重写。文章深入讲解了虚函数表原理、动态绑定机制,并对比了重载/重写/隐藏的区别。此外还介绍了纯虚函数、抽象类、override/final关键字等特性,通过内存布局分析揭示了多态底层实现,最后强调了基类析构函数设为虚函数的重要性以防止内存泄漏。全文系统性地剖析了多态相关概念及技术细节。

2025-10-29 14:47:56 3478

原创 C++继承机制:面向对象编程的基石

本文介绍了C++继承机制的核心概念,包括继承定义(public/protected/private)、基类派生类转换规则、作用域隐藏问题、派生类默认成员函数实现要点。重点分析了菱形继承问题和虚继承解决方案,比较了继承(is-a)与组合(has-a)的差异,指出组合优于继承的设计原则。文章通过大量代码示例详细说明了继承的访问控制变化、成员初始化顺序、静态成员特性等关键知识点,为面向对象编程中的代码复用提供了系统性的指导。

2025-10-29 14:02:36 3587

原创 【C++】深入理解list底层:list的模拟实现

本文介绍了C++中list容器的特性及其模拟实现方法。list是带头双向循环链表,适合频繁插入删除操作但不适合随机访问。文章详细讲解了如何实现list节点、构造函数、迭代器(包括普通和const版本)、插入删除函数等核心功能。重点阐述了迭代器的特殊实现方式,通过运算符重载使其能像指针一样工作。还讨论了拷贝构造、赋值重载等关键问题,并提供了完整代码实现。该模拟实现帮助读者深入理解list底层原理,为STL容器学习打下基础。

2025-10-12 14:06:05 911 4

原创 【C++】vector的使用和模拟实现

本文详细介绍了C++标准模板库中的vector容器。vector是动态数组,具备随机访问、动态扩容和连续存储特性。文章从基本用法入手,包括创建、访问元素、增删操作、容量管理和迭代器使用等,并特别分析了VS环境下的1.5倍扩容机制。重点讲解了二维vector的实现和vector底层模拟,包括构造函数、运算符重载、容量管理、迭代器失效问题等核心内容。通过代码示例展示了vector的深拷贝实现、插入删除操作中的迭代器处理技巧,最后提供了完整的vector.h头文件实现。

2025-10-07 13:48:04 921 2

原创 【C++】string类中的常用成员函数介绍

本文介绍了C++中string类的基本概念和使用方法。string类作为处理字符串的核心工具,相比C语言字符数组具有自动内存管理、丰富成员函数和运算符重载等优势。重点讲解了string对象的构造方法、访问与遍历操作(包括[]操作符、迭代器和范围for循环)、容量操作(size/length/capacity等)以及修改操作(插入/删除/查找/子串等)。通过示例代码展示了string类的常用接口,帮助读者理解如何高效安全地处理字符串。string类大大简化了字符串操作,是C++编程中不可或缺的重要工具。

2025-09-25 15:30:21 1071 1

原创 【C++】类和对象(三)

本文介绍了C++中类的多个重要特性:1. 初始化列表的使用方式及其注意事项,包括成员变量初始化顺序和缺省值设置;2. 类型转换机制,特别是通过构造函数实现的隐式类型转换及其限制;3. static成员的声明、初始化方法及其特性;4. 友元函数和友元类的概念及使用方式;5. 内部类的定义及其与外部类的关系;6. 匿名对象的创建方式及其生命周期特点。这些特性有助于理解C++类的封装、初始化、访问控制等核心机制。

2025-09-06 23:07:30 1066

原创 【C++】类和对象(二)

本文介绍了C++中类的6个默认成员函数,重点讲解了构造函数、析构函数、拷贝构造函数和赋值运算符重载。构造函数用于对象初始化,析构函数用于资源释放,拷贝构造函数实现对象拷贝,赋值运算符重载支持对象赋值操作。编译器会自动生成这些函数的默认版本:对内置类型进行值拷贝,对自定义类型调用其相应函数。当默认行为不能满足需求时(如需要深拷贝时),需要手动实现这些函数。文章通过日期类和栈类的代码示例,详细说明了各成员函数的特性和实现要点,并解释了运算符重载的规则和限制。

2025-09-02 16:38:50 975

原创 【C++】类和对象(一)

本文介绍了C++中类的定义、实例化及this指针等核心概念。主要内容包括:1.类的定义格式及类域作用;2.实例化过程及对象的内存分配规则;3.隐含的this指针工作原理;4.对比展示了C++与C语言实现栈的差异,体现C++封装特性。文章通过类与对象的类比,解释了类作为蓝图、对象作为实例的关系,并详细说明了成员变量存储、函数调用机制等底层原理,帮助读者理解面向对象编程的基础知识。

2025-08-31 16:27:18 1085

原创 【数据结构】二叉树的顺序结构实现

本文系统介绍了树和二叉树的数据结构。主要内容包括:1)树的基本概念与相关术语,如节点度、层次、深度等;2)二叉树的结构特点、特殊类型(满二叉树、完全二叉树)及其性质;3)二叉树的两种存储结构(顺序和链式);4)堆的概念与实现方法,包括堆的向下调整算法及C语言代码实现。文章重点讲解了堆这一基于完全二叉树的特殊数据结构,详细给出了堆的初始化、插入、删除等操作的算法过程和具体实现代码。

2025-08-03 15:07:07 1120

原创 【数据结构】栈和队列的实现

本文介绍了栈和队列两种基本数据结构的概念、特性及C语言实现。栈遵循后进先出原则,通过数组实现,包含初始化、入栈、出栈、获取栈顶等操作。队列遵循先进先出原则,通过链表实现,包含初始化、入队、出队、获取队首/队尾等操作。文章详细展示了两种数据结构的具体代码实现,包括头文件声明、源文件定义和测试用例。栈和队列作为线性表的特例,分别适用于不同场景,理解其实现原理对掌握数据结构基础至关重要。

2025-07-26 22:33:10 703

原创 【数据结构】双向循环链表的实现

本文详细介绍了双向循环链表的实现方法。双向循环链表采用带头节点的结构,每个节点包含前驱和后继指针。文章系统讲解了节点定义、初始化、插入(头插/尾插)、删除(头删/尾删)、查找、指定位置操作等核心功能的C语言实现代码,并提供了完整的头文件、实现文件和测试用例。通过哨兵位设计避免了循环遍历问题,所有操作都严格维护节点的前驱后继关系。代码实现包含动态内存管理、断言检查等健壮性设计,最后给出了链表销毁方法。该实现展现了双向循环链表可双向遍历的特性,为相关数据结构应用提供了实用参考。

2025-07-20 22:30:15 1372

原创 【数据结构】单链表的实现

本文详细介绍了单链表的数据结构及其基本操作实现。首先阐述了链表的概念,指出其物理存储非连续但逻辑上线性有序的特点,通过节点(包含数据域和指针域)连接实现。重点讲解了链表的各种操作:节点创建、打印、头插/尾插、头删/尾删、查找、指定位置插入/删除等,并强调了对指针操作的注意事项。文章提供了完整的C语言实现代码,包括头文件定义和功能测试示例。所有操作均通过二级指针实现,确保能正确修改链表结构。最后说明了链表销毁的重要性,完整演示了单链表的应用实现过程。

2025-07-17 17:19:30 1463

原创 【数据结构】基于顺序表的通讯录实现

本文系统介绍了顺序表的概念与实现,并基于顺序表实现了通讯录功能。主要内容包括:1)顺序表的结构与分类,对比静态顺序表与动态顺序表的优缺点;2)顺序表的基本操作实现,如初始化、增删改查等;3)利用顺序表实现通讯录系统,包含联系人信息的增删改查功能。文章通过详细代码示例展示了顺序表从理论到实践的应用过程,特别强调了动态顺序表在空间管理上的优势。该实现方案可作为数据结构学习的典型案例,有助于理解线性表的存储结构与基本操作原理。

2025-07-14 16:24:23 1168

原创 C语言——预处理详解

本文介绍了C语言预处理的相关知识,包括预定义符号(FILE、__LINE__等)、#define定义常量和宏的注意事项(括号使用、分号问题)、带副作用参数的宏风险、宏与函数的对比(性能vs安全性)、#和##操作符的用法、条件编译指令(#ifdef、#ifndef等)以及头文件包含的两种方式和避免重复包含的技巧(#pragma once)。特别强调宏定义时应考虑运算符优先级和参数副作用,建议宏名全大写以区别于函数。文章还讲解了#undef移除宏定义和嵌套头文件的优化处理方法。

2025-07-10 17:57:26 1414

原创 C语言——编译与链接

C语言代码需要通过编译器转换成二进制指令才能被执行。这个过程分为翻译环境(编译和链接)与运行环境。翻译环境包括预处理(处理宏和头文件)、编译(词法/语法/语义分析)、汇编(转机器指令)和链接(地址重定位)。运行环境则负责程序加载、执行和终止。编译链接过程涉及多个环节,最终生成可执行程序。了解这些步骤有助于更好地理解程序的构建过程。

2025-07-07 23:27:26 1233

原创 C语言—动态内存管理(malloc,calloc,realloc,free,内存泄漏,柔性数组)

本文介绍了C语言动态内存管理的关键内容。主要包括: malloc/free函数的基本用法及注意事项; calloc和realloc函数的功能及区别;6种常见的动态内存使用错误;柔性数组的特性及两种实现方式。重点强调了内存泄漏、越界访问等常见问题的防范措施,为C语言开发者提供了全面的动态内存管理指南。

2025-07-04 20:15:05 1331

原创 C语言---自定义类型:结构体

本文全面介绍了C语言中结构体的核心概念与应用。首先讲解了结构体的声明、初始化和自引用方法,其次详细解析了结构体内存对齐规则,通过实例演示计算过程,并说明对齐原因是为了提升访问效率(空间换时间)。还对比了结构体传参方式,建议优先传递地址以提高性能。最后介绍了位段的概念、内存分配机制及跨平台问题。

2025-07-02 23:27:32 1165

原创 C语言---常见的字符函数和字符串函数介绍

C语言标准库提供了丰富的字符和字符串处理函数。字符分类函数(如islower、isdigit)用于判断字符类型;字符转换函数(如tolower、toupper)实现大小写转换。常见字符串函数包括:strlen(字符串长度)、strcpy(字符串复制)、strcat(字符串拼接)、strcmp(字符串比较)及其安全版本(如strncpy)。此外还有strstr(子串查找)、strtok(字符串分割)和strerror(错误信息)等函数。

2025-06-28 22:18:51 1513 2

原创 C语言---冒泡排序和qsort函数的应用

4 int (*compar)(const void*,const void*)是函数指针,指向的是两个元素的比较函数,比较函数用来比较两个数的函数大小,这个是根据不同类型数组进行排序时,由我们自行编写的。调用 cmp 比较相邻元素。

2025-06-26 23:09:55 1212

原创 C语言---深入理解指针(3)

数组指针变量存放的是数组的地址,能够指向数组的指针变量。//指针数组//数组指针p与*结合,说明p是一个指针变量,然后指向一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。[]的优先级高于*号,所以必须加上()来保证p与*先结合。

2025-06-24 22:12:29 1404

原创 C语言---深入理解指针(2)

这里就利用指针进行数组元素的输入和输出,数组名arr是数组首元素的地址,可以赋值给p,其实数组名arr和p在这里是等价的。这里使用&arr[0]的方式得到数组第一个元素的地址,但其实数组名本来就是地址,而且是数组首个元素的地址。可见函数内部没有正确获取数组元素个数。数组传参的时候,传递的是数组名,数组传参本质上传递的是数组首元素的地址。

2025-06-22 23:16:43 1282

原创 C语言---深入理解指针(1)

在指针类型中有一种特殊的类型是void*类型,是一种没有具体类型的指针,这种指针类型可以接收任意类型变量的地址。一般void*类型的指针是使用在函数参数的部分,用来接收不同数据类型变量的地址,这样的设计可以起到泛型编程的效果,具体我将会在以后博客中的深入理解指针内容的部分来描述。指针的类型决定了对指针解引用的时候能一次操作几个字节,char*的指针解引用只能访问一个字节,而int*的指针解引用能访问4个字节。这里的*是表明pa是指针变量,而前面的int是在说明pa指向的是整型(int)类型的对象。

2025-06-20 23:30:06 1033

原创 C语言---操作符详解

有时我们得到的不是一个结构体变量,而是得到了一个指向结构体的指针:int x;int y;//结果:x = 10 y = 20结构体指针->成员名本文介绍了C语言中所有操作符及其用法,希望对你有用。。

2025-06-19 23:07:39 1228

原创 C语言---扫雷游戏的实现

本文的主题是用C语言写一个扫雷游戏,供读者参考。游戏要求:1. 游戏可以通过菜单实现继续玩或者退出游戏。2. 扫雷的棋盘是9*9的格子。3. 默认随机布置10个雷。4. 可以排查雷,如果位置不是雷,就显示周围有几个雷;如果位置是雷,就游戏结 束。把10个雷之外的所有非雷都找出来,排雷成功,游戏结束。

2025-06-11 21:43:39 1390

原创 C语言---数组详解

本文总结了一维数组和二维数组的概念、用法、注意事项,还介绍了二分查找的使用。

2025-06-08 17:52:59 1288

原创 C语言---猜数字游戏的实现

本文会讲解如何用C语言写一个猜数字游戏,供读者参考。游戏要求:1. 电脑自动生成一个1~100的随机数2. 玩家猜数字,猜数字的过程中,根据猜测数据的大小给出猜大了或者猜小了的 反馈,直到猜对,游戏结束。本文写了一个猜数字的游戏,并细致讲解了需要用到的核心函数,希望对你有用。

2025-06-05 22:03:37 1239

原创 C语言---printf scanf及其占位符详解

printf的作用是向屏幕设备按照规定的格式输出信息。要注意,在使用中要利用到头文件<stdio.h>,它里面的f全称为format(格式化),表示可以定制输出文本的格式。下面我们利用printf写一个简单的代码。return 0;结果如图:可以看到,利用printf()可以在屏幕上打印出自己想要的结果。printf()在运行结束后光标就停留在输出结束的地方,不会自动换行。所以为了让光标移到下一行的开头,可以在文本末尾处添加一个换行符\n。

2025-06-03 22:15:23 1292

原创 C语言---基本数据类型

字符型可以设置为有符号字符型signed char、无符号字符型unsigned char,用来表示字符。本文介绍了C语言中的四大种基本数据类型,分别为字符型,整型,浮点型,布尔型。以及每种类型中的分支和取值范围,还有所占的字节数。这可以让我们对基本数据类型有清晰的认识。后续我会不断的分享知识。

2025-06-02 19:51:36 1076 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除