自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构——链式二叉树的实现与分治编程思维(c语言实现)

在之前的学习中,我们初步学习了二叉树的概念和实现二叉树的顺序结构,最主要的是使用二叉树的顺序结构建堆,从而实现堆排序,这一章我们要学习的是二叉树的另一个结构——二叉树的链式结构,与顺序结构不同的是,顺序结构的底层是一个数组,链式结构是使用递归将多个结点链接起来组成的二叉树,讲到这里,递归还不是很熟悉的小伙伴需要回去复习递归的知识才能更好的理解链式二叉树的实现,话不多是,我们马上开始这一期的学习吧。

2024-08-24 14:29:44 374 24

原创 c++进阶——继承的定义,复杂的菱形继承及菱形虚拟继承

当我们学到这一章时,已经学完了c++初阶的大部分内容,也将正式进入c++进阶的内容。在掌握更多技术的同时,我们学习的知识也将越来越有挑战性,需要我们日复一日的坚持将它们学完,我们也要相信我们学习的知识不会辜负我们。继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

2024-08-20 00:27:50 1169 106

原创 c++模板进阶——模板特化和模板分离编译

我们之前的章节简单的介绍了模板初阶的知识,了解了模板的使用和重要性,因为我们那时学习的知识不足以理解模板进阶的大部分内容,而在经过学习模板初阶之后知识之后,我们已经初步具备学习模板进阶知识能力。一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式(编译原理我们在c语言模块了解过一点)。

2024-08-13 12:58:45 1219 114

原创 c++STL中stack,queue使用方法和模拟实现,及适配器模式编程

1.1 stack的介绍栈是计算机中一个重要的数据结构,因其先进先出的特性,可以解决许多结构上的问题,进行栈的学习,了解它的底层是很有必要的。1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

2024-08-10 01:11:29 1251 112

原创 c++STL中list介绍,模拟实现和list与vector对比

我们在前几期已经详细介绍了STL中string,vector容器的使用及模拟实现,不难发现,string和vector的结构很相似,他们在物理上都是连续的结构,想访问下一个位置的数据,只需要让相应容器的迭代器自增就可以实现,而我们今天要介绍的list,则无法用这种方法访问下一个位置数据,这也是我们在这一期需要解决的问题。1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2024-08-06 20:29:37 1533 90

原创 c++STL容器中vector的使用,模拟实现及迭代器使用注意事项和迭代器失效问题

在前面的章节我们已经接触过了关于STL的知识,也就是string类,我们详细介绍了string类的特性及使用,而严格来说string类并没有被归为STL中,因为string类的出现早于STL,string类的接口也比STL中的单个类多,使得string类较其他类显得冗余,这一期我们就要开始讲STL中的内容。1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。

2024-08-01 18:40:23 1545 92

原创 c++初阶知识——string类详解

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

2024-07-25 12:00:15 2371 103

原创 c++初阶知识——初识模板

class 类模板名// 类内成员定义// 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误,具体原因后面会讲// 扩容++_size;

2024-07-19 10:37:56 1471 98

原创 c++初阶知识——内存管理与c语言内存管理对比

我们在c语言模块已经学过了关于内存管理的知识,其中c语言最具特点的内存管理就是有关于动态内存管理部分。

2024-07-18 21:15:01 1502 62

原创 c++初阶知识——类和对象(下)

(3)引⽤成员变量const成员变量没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。(4)C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的成员使⽤的。(5)尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。如果你没有给缺省值,对于没有显⽰在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。

2024-07-17 05:01:54 1520 62

原创 c++初阶知识——类和对象(中)

目录1.类的默认成员函数2.构造函数 3.析构函数 4.拷贝构造函数5.运算符重载 5.1 赋值运算符重载 5.2 使用运算符重载等特性实现日期类 6.取地址运算符重载6.1 const成员函数 6.2 取地址运算符重载 默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解⼀下即可。其次就是C++11以后还会增加两个默认成员函数,移动

2024-07-16 03:41:14 1680 67

原创 c++初阶知识——类和对象(上)

(1)class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。public:// 成员函数perror("malloc申请空间失败");return;top = 0;// ...扩容int Top()private:int* arr;int size;st.Init();

2024-07-11 20:28:19 2013 71

原创 C++入门基础篇(下)

以上这个程序就是对引用在对函数传参时效率提高的体现,通常我们如果要交换两个数的值,如果要写一个函数实现,我们必须将两个数的地址,由指针来交换它们的值,而我们在c++学了引用之后,我们也可以使用引用接收两个数的值来交换两个数的值。C++的引⽤跟其他 语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向, Java的引⽤可以改变指向。C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功 能有重叠性,但是各有⾃⼰的特点,互相不可替代。

2024-07-10 18:18:11 1844 32

原创 c++入门基础篇(上)

(1)定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等int i = 20;//定义变量} //定义函数(2)namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不再冲突了int main()return 0;(3)C++中域有函数局部域,全局域,命名空间域,类域;

2024-07-09 19:49:24 1469 34

原创 数据结构——二叉树之c语言实现堆与堆排序

在上一期我们介绍了有关于树的基础概念,了解了关于树的各名称的含义,然而在现实中树被用得最多的场景还是在我们计算机中的资源管理器的文件存储结构中,在其他场景被使用的情况很少,所以我们这一期要介绍一种被广泛使用的树型结构——二叉树。

2024-07-08 18:12:48 2122 59

原创 数据结构——树的基础概念

目录1.树的概念2.树的相关概念 3.树的表示(1)直接表示法(2)双亲表示法 (3)左孩子右兄弟表示法 4.树在实际中的运用(表示文件系统的目录树结构) 树是一种非线性的数据结构,它是由n(n>=0个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。我们现实中的树是这样的:而我们数据结构中的树是这样的:有一个特殊的结点,称为根结点,根结点没有前驱结点除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合

2024-07-04 12:59:17 3732 68

原创 (超详细)数据结构——“队列”的深度解析

队列与栈都是线性表,它们的结构也非常类似,都是一头进一头出,那么它们有什么区别吗?答案是有的,虽然它们同为线性表,但是栈的出栈入栈方式为后进先出,而队列的出栈入栈方式为先进先出,具体我们在正文讲解。

2024-07-02 01:20:15 1977 62

原创 (超详细)数据结构——“栈”的深度解析

在前几章我们介绍了线性表的基本概念,也讲解了包括顺序表,单链表,双向链表等线性表,相信大家已经对线性表比较熟悉了,今天我们要实现线性表的另一种结构——栈。

2024-06-30 14:43:27 1435 58

原创 数据结构——带头双向循环链表(c语言实现)

我们在前几期详细地讲解了不带头单向不循环链表(单链表),使用它的底层代码实现了一个简单的通讯录项目,也介绍了链表分为八种,但是其中最常用的只有两种:(1)不带头单向不循环链表,(2)带头双向循环链表,今天我们要讲解的就是第二种带头双向循环链表。

2024-06-26 19:18:31 2832 55

原创 数据结构:为什么说链表是顺序表的升级版(c语言实现单向不带头单链表)

我们在之前的几篇文章中详细的讲解了顺序表的特点,增删改查操作和动态顺序表的优点,并使用顺序表的底层结构实现了通讯录项目,似乎顺序表是一个非常完美的数据结构,它可以实现按照需求实现增删查改,对内存的控制也较为合理,空间都是在需要时手动开辟的。但是顺序表真的完美吗?事实上它并不完美,经过我们思考,顺序表还是存在一些问题,例如:(1)。这些问题都是我们应该考虑的,而我们接下来要介绍的另一种数据结构——链表,就能在实现属性表的各个功能的前提下很好的解决这些问题。

2024-06-22 13:57:49 2652 53

原创 (超详细)基于动态顺序表实现简单的通讯录项目

我们在上一章节用c语言实现了线性表中的的动态顺序表,那么顺序表就只是顺序表吗?当然不是,使用顺序表结构可以实现很多项目,许多项目的数据结构都会用到顺序表,本章节我们就要使用顺序表实现一个简易的通讯录项目。

2024-06-16 21:56:48 1857 35

原创 数据结构:手撕代码——顺序表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。例如我们有一个数组,这个数组中的元素都占相同大小的内存,都具有相同的类型,而它们也按顺序排列的。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...。什么意思呢?

2024-06-14 19:58:41 1698 56

原创 c语言:文件操作

磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

2024-06-09 22:50:47 2029 54

原创 c语言:动态内存管理

include<stdlib.h>//包含malloc函数的头文件int main()return 0;malloc函数返回的是void*类型的指针,所以我们的方法是将它强制转换成int*类型的指针再赋给p,这样我们的10个int类型的空间就用malloc函数开辟好了。这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。1.如果开辟成功,则返回一个指向开辟好空间的指针。2.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。

2024-06-05 19:54:00 1551 47

原创 c语言:自定义类型(枚举、联合体)

位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。int _b:5;int _c:10;int _d:30;A就是一个位段类型。那位段A的大小是多少?这就不得不介绍以上的代码是什么意思了,_a后面的2表示我们只给_a 变量分配两个比特位的空间,以此类推,后面的5、10、30都是给各自变量分配了该数量的比特位的空间,这是为什么呢?

2024-06-04 12:47:49 1387 25

原创 c语言:自定义类型(结构体)

有了结构体类型,那如何定义变量,其实很简单。int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化int data;//结构体嵌套初始化//结构体嵌套初始化//书名//作者//编号//价格int main()struct book s1 = { "c语言","谭浩强","THQ3324",55.5f };//

2024-06-02 17:27:12 1038 21

原创 (含笔试题)深度解析数据在内存中的存储

在c语言中,有像许许多多的数据类型,我们学过之后只需要使用就可以了,不关心它的内部是如何实现的,因此,有时我们写出的一些代码出现的结果是我们自己无法预料的,也许这样的问题正是由于我们不了解数据内部是如何存储和取出所导致的,今天,我们就来详细介绍数据在内存中是如何存储的,重点从整型与浮点型来展开介绍。大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中;小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。

2024-06-01 11:15:34 1229 17

原创 (超详细)字符函数和字符串函数【下】

在上一期我们介绍了长度不受限制的字符串函数,这一期我们接着讲长度受限制的字符串函数等内容。

2024-05-30 18:07:45 1327 12

原创 (超详细)字符函数和字符串函数【上】

strlen函数是一个求字符串长度的函数,内部的工作原理是只要不遇到\0就一直向后走并记数,遇到\0就停下。

2024-05-29 20:41:43 1293 17

原创 c语言:摆脱对指针的恐惧【5】

上一期我们讲了数组指针、&数组名和数组名的区别是&数组名是指整个数组的地址,而数组名仅表示数组首元素地址,对他们加一的结果也大不相同,我们还讲了一维数组和二维数组传参的原理及一级指针和二级指针传参的原理,复习完上一期的内容,我们马上开始这一期的内容吧。

2024-05-28 00:25:19 1362 8

原创 c语言:摆脱对指针的恐惧【4】

在上一期指针我们讲到了二级指针是的作用是存放一级指针的地址,还讲了指针数组是一个可以存放若干个指针变量的数组,这里我们再复习一下,下面指针数组是什么意思?上面三行代码都分别定义了一个数组,第一行代码的arr1数组存放了10个int类型的指针变量 ,第二行代码的arr2数组存放了4个字符类型的指针变量,第三行代码的arr3数组存放了三个二级字符类型的变量,复习完上一期学过的内容,我们马上开始这一期内容的学习吧。

2024-05-25 04:47:49 1153 6

原创 c语言:摆脱对指针的恐惧【3】

接上一期我们讲到了野指针的概念,野指针的成因和避免野指针的方法,又讲了指针的运算,今天我们接着讲指针新的内容,指针的每一章都很重要,今天也不要忘记学习。

2024-05-22 00:15:25 876 5

原创 c语言:摆脱对指针的恐惧【2】

伙伴们好久不见,这一期是我们指针的第二期,上一期指针收到了不错的反馈,我能感受的小伙伴们学习的热情,话不多说,我们马上开始这一期的内容吧。在学习新知识之前,也不要忘记复习学过的知识,上一期我们讲了指针就是地址,人们口中的指针就是,被称为指针变量,指针变量指向某个变量的首地址,还讲了指针变量分不同类型的意义是,我们还讲了&(取地址符)可以对,*(解引用符)可以。

2024-05-20 15:51:54 944 4

原创 c语言:摆脱对指针的恐惧【1】

指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。比如:char*的指针解引用就只能访问一个字节,而int*的指针的解引用就能访问四个字节。我们这一期的指针就到此结束啦, 我们下期不见不散,未完待续。。。。。。。

2024-05-18 00:28:02 2075 7

原创 (超详细)求一个数中二进制位多少个1的n种境界

假设我们输入7,它的二进制表示为00000111,我们只需要创建一个变量count,然后对00001111模2(7%2),只要它的结果为1,说明它最右边的一位为1,这时我们就得到了一个1,只要得到一个1,就让count加1,完成这个动作后我们还需要对左边的每一位二进制位判断,是1count加一,不是则不进行任何操作,那么我们就要在做完一次以上动作之后把最右边的数丢掉,让原本输入的数每次除2便可以依次得到左边的每一位数,这样的操作我们使用循环实现,当我们输入的数变成0时循环结束。

2024-05-17 17:19:51 761 5

原创 c语言:递归与迭代

它却没有得出结果,这是为什么呢,因为,函数在内部多次调用了自己,产生了大量的重复计算,导致计算量巨大,代码执行效率非常低,让计算机也无法快速得出结果,这个例子告诉我们,递归是有使用条件的 ,如果要设计一个需要重复计算的程序,不能无脑使用递归,而是首先要思考递归能不能用,是否能让代码简洁的同时,更加高效,那么此类例子我们如何解决呢?可以看到,很快就得到了结果,但是答案是错误的,因为要求的数太大,一个字节无法表示,但是我们可以很直观的看见两者的差别,在这这样一个例子中,使用迭代会优于使用递归。

2024-05-14 18:02:02 1201 8

原创 扫雷游戏:c语言实现

游戏规则:进入游戏界面,按1开始游戏,按0退出游戏,我们在一个9×9的棋盘中布置了10个地雷,玩家任务是找出所有空白区域,找出所有空白区域,玩家胜利,如果踩到雷则游戏失败,每找出一个空白区域,该空白区域都会提示周围有几个雷,玩家正是通过这个信息一步步找出所有空白区域的。那么我们该如何去实现它呢,首先,我们要创建一个主函数,一个测试函数test,再创建一个打印游戏初始页面的函数menu,按1玩游戏,按零退出游戏,如果是其他数字,则显示输入错误,必须重新输入:那么test函数是怎么实现的呢?

2024-05-10 23:22:45 770 10

原创 二分查找:c语言实现

例如上图,如果要查找的数字小于中间值5,则5前面的数字全部忽略,只需查找5之后的数字,相反,如果要查找的数字小于 5,则5后面的数字全部忽略,只需查找5之前的数字,而如果还没有查到,则重复这样的操作,每次都丢掉一半的数字,直至找到或者找完所有数字。算法介绍:二分查找是在一组有序数字中查找其中一个数的快捷方法,相比于一个一个查找数字,二分查找不仅快,节省空间,且简便。2.输入一个数(需要从数组中查找的数)key。

2024-05-08 18:47:15 756 5

原创 c语言实现趣味小游戏:猜数字

为了能更直观的看清楚它的缺点,我们删掉几行代码试试:可以看到,除了删掉的几行代码之外,前面几行没有删的代码的执行结果跟第一次执行的结果一模一样,那是因为rand函数是由某种算法生成的,并不是真正的随机,真正的随机数是无法预测下一个数字的值是多少的,这样就无法实现我们生成随机数的目的,当然,肯定是有解决方法的,那就是让它生成的数变成不可预测的值————rand函数的原理是对一个叫“种子”的基准值进行运算的随机数,它生成随机数的默认种子是1。

2024-05-05 12:12:28 1076 10

原创 c语言实现九九乘法表

c语言是一门功能强大的语言,可以实现很多具体的案例,今天我们要用c语言来实现九九乘法表的输出,在写这样一个程序之前,我们首先脑子要有一个九九乘法表的画面,然后才是去思考如何用代码一步一步实现它。

2024-05-04 21:32:40 533 5

空空如也

空空如也

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

TA关注的人

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