- 博客(45)
- 收藏
- 关注
原创 C++多态(虚函数,纯虚函数,抽象类)
在基类中进行,把基类中需要定义为虚函数的成员函数声明为virtual基类中的某个成员函数被声明为虚函数后,就可以在派生类中重新定义。在派生类中重新定义时,其函数原型包括返回类型,函数名,参数个数和类型,参数的顺序都必须与基类中的原型完全一致(指向派生类对象的指针,不能指向私有派生类的对象;当指向公有派生类的对象是只能直接访问派生类中从基类继承下来的成员不能直接访问公有派生类中定义的成员;(1)虚函数的声明只能出现在类函数原型的声明中,不能出现在函数实体实现时;
2024-07-04 20:57:52 607
原创 C++继承与派生
派生类的构造函数需要用合适的初值作为参数,隐含调用基类的构造函数和新增对象成员的构造函数来初始化各自的成员,再用新加的语句对新增数据成员进行初始化。d.如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责间接基类的构造(只服从于直接领导)在C++中,基类成员的初始化工作由基类的构造函数完成,而派生类的初始化工作由派生类的构造函数完成;派生类中声明的成员名如果与基类中声明的成员名相同,则派生类中的成员起支配作用;派生类从基类保护继承时,基类的公有成员在派生类中改为保护成员,保护成员不变;
2024-06-19 19:52:17 740
原创 C++类和对象
一般情况下在声明类的时候都要给类声明和定义构造函数,如果没有声明,编译系统会自动生成,但是只开辟空间并不不会赋初值,所以可能会报错,所以尽量声明定义构造函数。在函数成员返回时,如果需要返回该对象的指针,只需使用return this,在返回本对象的引用时只需使用return this。在实例化对象时,传递的参数不一样(比如:有的传递两个参数,有的传递一个参数,有的不传递参数);用static修饰的成员函数,被定义为静态的函数,在类的各个实例化间是共享的,不会为每一个类的实例都创建一个静态成员函数的实现;
2024-06-18 18:39:18 911
原创 对有向图的拓扑排序的理解
结点的最早发生时间=比如结点j的最早发生时间就是从源点到结点j的最长路径长度——为什么是最长路径长度,因为结点j肯定有前驱结点,只有在前驱节点完成并到达j之后,j才能开始,那么j必须等到其所有的前驱节点都完成之后才可以进行,那么就是最慢的这条路径决定着j事件发生的时间,因此结点j的最早发生时间是由最长路径决定的,因此为最长路径的长度;结点的最晚发生时间,我们从汇点往前推,汇点的最早发生时间等于最晚发生时间,而,j点的最晚发生时间就等于k点的最晚发生时间减去边的权值;
2024-06-05 10:20:38 255
原创 最短路径——迪杰斯特拉与弗洛伊德算法
而p也是属于其他所有结点中的一个结点,那么自然也会有从i->p的最短路径,假设i->p的最短路径的前驱结点为m,那么i....m->p->j;也就是说,m也是属于从i->j的最短路径上的结点(因为单个值最小,所有的单个值的和肯定也最小,m,是保证从i->p的路径最短的点,那么m理应属于i->j的最短路径)以此类推直到找到距离i最近的前驱节点;根据上面的理解,我们既然可以找到i->j的前驱节点k,那么自然也能找到i->k的前驱结点,以此类推,递归下去,就能找到i->j的路上的所有其它的结点;
2024-06-05 10:16:42 422
原创 并查集与克鲁斯卡尔算法详解
合并的原则:按秩合并,使用秩来表示树高度的上界,在合并时,总是将具有较小秩的树根指向具有较大秩的树根,简单的说就是总是将比较矮的树作为子树,添加到较高的树中,为了保存秩,需要额外使用一个与uset同长度的数组,并将所有的元素都初始化为0;但是其实并查集只是按照顺序加边,没有比较边的权值这一过程,所以如果我们按照边的值从小到达进行排列的话,我们就只需要前面几条较小的边就能将所有的节点连接起来,最终得到最小的生成树;实现:用树来表示集合,树的每个结点就表示集合中的一个元素,树根对应的元素就是该集合的代表。
2024-06-05 10:10:53 730
原创 广义表的相关内容与算法分析(重点分析:求广义表深度的递归过程)
/C语言枚举类型 ATOM=0,LIST=1;//要么为0,要么为1;}atom_htp;//原子结点的值域atom和表结点的指针域htp的联合体体域在这里enum是C语言的枚举:共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。我们可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值,共用体提供了一种使用相同的内存位置的有效方式!
2024-04-16 21:51:27 1078
原创 数组以及稀疏矩阵的快速转置算法详细分析
/定义行标,列标}Triple;typedef struct//定义矩阵//矩阵的行,列数,以及非零元素的个数;}TSmatrix;
2024-04-15 23:08:59 1112
原创 二叉树的遍历的递归与非递归算法
看了以上三种方式遍历二叉树的例子,应该就能明白三种遍历方式的本质与区别,其实我们可以看出,无论以何种方式,我们只要把握好访问的顺序,并且将每一个根结点下的子树都看成一个新树,再按照某种遍历方式访问这个这个新树即可!例子:中缀表达式转后缀表达式;(前缀表达式:波兰表达式;后缀表达式:逆波兰表达式)前缀表达式:-+a*bc/de(也就是以先序遍历访问上述二叉树的顺序)中缀表达式:a+b*c-d/e(也就是以中序遍历访问上述二叉树的顺序)
2024-04-08 22:10:05 893
原创 模拟实现strstr()函数的两种方式
查找字符串:返回指向str1中首次出现的str2指针,如果str2不是str1的一部分,则返回空指针;if(pch!return 0;结果为:This is a sample string;因为此时,返回的pch指针,指向的是simple的位置,调用另一个函数strncpy,就替换到相应位置的simple,变为sample;那么此时strstr函数就可以用于判断,子串是否包含在某字符串中;
2024-03-26 16:41:10 290
原创 自定义函数:Getnumber();Compare();Execute()
两个算数运算符进行比较,返回运算符优先级较高的那一个;输入两个数字字符,一个运算符,对其进行操作;
2024-03-10 23:19:27 399
原创 找完数——循环的用法
【问题描述】一个数如果恰好等于它的因子之和,这个数就成为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程序打印出1000之内(包括1000)所有的完数,并按如下格式输出其所有因子:【输入形式】无输入【输出形式】输出1000以内所有的完数及其因子,每行输出一个完数及其因子。【提示】完数不止一个哦!而且最后一个数后面的结束标点符号是英文状态的句号。
2024-03-08 23:15:59 400
原创 数据结构——尾插法
随机输入一些数据,请采用尾插法创建一个带头结点的单链表,将数据存入,然后顺序遍历该单链表并输出数据,以查看是否创建成功。Linklist L:其中L是表示头指针变量;(1)首先定义结构体类型的变量,用于存放链表中的数据,next指针用于寻找链表中的后件。并且在输入结束之后,需要把尾指针指向的内容设置为空:r->next=NULL;在这里利用typedef定义的:Node*,和Linklist是等价的。首先将s,r均初始化为L,r始终指向链表L的尾端;第二步:引入新的结点:s;如图所示:上述关键两步的含义;
2024-03-05 22:51:38 524
原创 python的深拷贝与浅拷贝
数据的引用:在程序中使用变量来访问和操作另一个变量或对象的方法,通过引用,可以使用一个变量来命名另一个变量,而不是创建一个副本,即对引用的修改会直接反映在原始变量上。值语义类型的编程语言:变量之间的操作是基于值的比较,比如相等性的判断;在这里通过引用(&),ra与a指向同一个地址,对应的变量值为10,而通过ra对变量值进行修改,同时也会引起变量a的值发生变化。值语义类型的编程语言:变量存储的是实际的数据值,而不是指向数据的引用。对象语义类型的编程语言与之想法,指向的就是数据的引用。
2024-02-17 12:54:12 322
原创 python中:++与--;链式赋值;逗号
Python的链式赋值与C语言的链式赋值的区别。在Python中,链式赋值是一种同时给多个变量赋值的方式,可以将一个值同时赋给多个变量。Python的链式赋值是将多个变量指向同一个对象,而C语言的链式赋值是将多个变量分别赋予不同的值。因此C语言的赋值语句具有返回值,而python的赋值语句仅仅是一条语句,不是表达式,没有返回值。注:在逗号与赋值=同时出现的时候,首先执行的应该是赋值语句,x=5,y=6,x=1。而在C语言中,链式赋值是一种连续赋值的方式,每个变量都会被赋予不同的值。,它们之间没有共享关系。
2024-02-16 22:50:54 1287
原创 qsort()函数的使用——C语言
解析:void*base:是待排序的数组的第一个元素的地址;size_t num:是数组中元素的个数;size_t size:是待排序的数组每个元素所占的空间大小(占几个字节)(传递该参数,便于确定访问时跳过几个元素,跳过一个元素时需要跳过几个字节)int(*compar)(const void*,const void*):是一个函数指针,compar函数是比较待排序数组中两个元素的大小,并且有返回值,返回值>0,表示左边的元素>右边的元素;返回值=0,表示左边的元素=右边的元素;
2023-09-16 20:09:56 49
原创 C语言中的%u与整型提升和原码反码补码的结合应用
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。11111111,此时因为是无符号类型,那么此时1代表的不是符号位,那么该数为正数,那么在前补0;原码:是机器数中最简单的一种表示形式,第一位为符号位,符号位是0,表示正数,符号位是1表示负数;//又因为此时%u,那么为无符号类型,此时为正数,那么原码反码补码均一致,结果就为以上;signed int 是有符号的char类型,与以上的结果一致;
2023-09-07 17:35:47 604 1
原创 交换数组a和数组b里面的内容(两个数组的大小相等)——C语言
那么有结果可知:警告为:从double到float截断,并且交换过后的结果并不是原数组的元素,所以不能发生完全的转换!所以综上所述:两个不同类型的数组之间的交换是不可能的;数组是提前已经声明的,不可再改变其数组的类型!由结果可知:交换过后的结果还是各自都自动转换成了原来的数组类型。本质上是一样的,交换对应位置的数组中的元素,之后进行打印。
2023-08-15 10:22:42 329 1
原创 编写一个程序,返回组成某一非负整数的各个数字之和—C语言
并且将该整数的最后一位剥离出来更为简单,只需要%10即可得到该整数的最后一位数字,正如代码中所体现的。那么由以上例子可以看出利用函数递归最终即可将问题简化。基本原理:利用函数递归。
2023-07-13 09:53:10 125 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人