- 博客(41)
- 收藏
- 关注
原创 1.2.2 算法的时间复杂度
有些算法是不能事后再统计的,如:导弹控制算法 能否事先估计?当问题规模足够大的时候,可以只考虑阶数高的部分。:如果有好几千行代码按这种方法需要一行一行数?有关,如:超级计算机 v.s. 单片机。那么我们如何评估算法的时间开销?有关,越高级的语言执行效率越低。:是否可以忽略表达式某些部分?那么如何比较两项的阶数呢?3,4 --3000次。
2024-10-26 20:27:58
177
原创 栈的基本概念
e-d-c-b-a b-e-d-c-a 等。如果有n个不同元素入栈,出栈元素不同摆列的个数为。有5个元素入栈,那么出栈顺序有42种。进栈顺序:a-b-c-d-e。栈(Stack)是只允许在。进行插入或删除操作的线性表。重要术语:栈顶,栈底,空栈。有哪几种出栈顺序呢?
2024-10-23 22:08:44
138
原创 静态链表的操作
②数据元素数量固定不变的场景(如操作系统的文件分配表FAT)设起始地址为 addr,e1的存放地址为 addr+8*2。静态链表:分配一整片连续的内存空间,各个结点集中安置。每个数据元素4B,每个游标4B(每个结点共8B)②从头结点出发找到位序为i-1的结点。查找:从头结点出发遍历后面的结点。①找到一个空的结点,存入数据元素。可以将空闲的结点next设为-2。静态链表:用数组的方式实现的链表。把a【0】的next设为-1。④修改i-1号结点的next。③修改新结点的next。②修改前驱结点的游标。
2024-10-23 21:45:23
155
原创 单链表的建立
养成好习惯,只要是初始化单链表,都先把头指针指向NULL。头插法,尾插法的核心在于初始化操作,指定结点的后插操作。2.每次取一个数据元素,插到表头或者表尾。1.初始化一个单链表。重要应用:单链表的逆置。
2024-10-22 22:08:31
165
原创 单链表的插入与删除
ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。(找到第i-1 个结点,将其指针指向第i+1个结点,并释放第i个结点)ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入制定元素e。(找到i-1的节点,插在其后面)但是如果p是最后一个及诶按,只能从表头开始一次寻找p的前驱。按位序插入(不带头结点)按位序插入(带头结点)
2024-10-20 21:33:34
318
原创 单链表的定义
增加一个新的结点:在内存中申请一个结点所需空间,并用指针p指向这个结点。typedef关键字--数据类型重命名。typedef 那么如何用代码定义一个单链表呢?
2024-10-17 22:04:45
209
原创 顺序表的查找
因为虽然指针指向的是同一个地址,如果指针所指向的数据类型出错,访问数据元素时也会出现问题。GetElem(L,i):按位查找。获取L中的第i个位置元素的值。
2024-10-17 21:16:08
229
原创 顺序表的插入与删除
ListDelete(&L,i,&e):删除操作,删除表L中的第i个位置的元素,并用e返回删除元素的值。ListInsert(&L,i,e):插入操作。在表L的第i个位置插入指定元素e.删除操作的时间复杂度。
2024-10-16 22:19:37
189
原创 顺序表的定义
把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关。③拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)malloc 函数返回一个指针,需要强制类型转化为你定义的数据元素型指针。可以放弃治疗,顺序表的表长刚开始确定后就无法更改(存储空间是静态的)顺序表--用顺序存储的方式实现线性表。C++--new,delete关键字。C--malloc,free函数。二.顺序表的实现--静态分配。二.顺序表的实现--动态分配。如果数组存满了怎么办?动态申请和释放内存空间。
2024-10-13 21:33:33
483
原创 线性表的定义和基本操作
线性表是具有相同数据结构的n个数据元素的有限序列,其中n为表长,当n=0时线性表是一个。,其中若用L命名线性表,那么其一般表示为L=(a1,a2,a3,...,an)返回线性表L的长度,即L中数据元素的个数。删除表L中第i个位置的元素,并用e返回删除元素的值。销毁线性表,并释放线性表L所占用的内存空间。在表L中的第i个位置上插入指定元素e。构造一个空的线性表L,分配内存空间。在表L中查找具有给定关键字值的元素。a1为线性表中的第i个元素元素线性表中的。获取表L中第i个位置的元素的值。
2024-10-13 20:09:19
213
原创 1.2.1 算法的基本概念
(Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出。算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。由于根据相同的数据却得到了两种不同的结果,所以这不叫做算法。个输出,这些输出是与输入有着某种特定关系的量。下一节将重点讲解算法的高效率与低存储量需求。个输入,这些输入取自于某个特定的对象的集合。
2024-07-13 14:33:11
310
原创 1.1.2数据结构的三要素
顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储。链式存储:逻辑上相邻的元素在物理位置上可以不相邻,借助指示元素存储地址的指针来表示元。索引存储:在存储元素信息的同时,还建立附加的索引表。(2)结构类型:其值可以再分解为若干成分(分量)的数据类型。散列存储:根据元素的关键字直接计算出该元素的存储地址,又称。数据元素之间是一对一的关系。数据类型是一个值的集合和定义在此集合上的一组操作的总称。2.数据的存储结构会影响存储空间分配的。的,指出运算的具体操作步骤。
2024-07-05 12:00:58
711
原创 数据结构 1.1 数据结构的基本概念
早期计算机只能处理纯数值的问题,如世界第一题计算机ENIAC是用来计算导弹的轨迹方程和原子弹的爆炸方程等。倘若我们用数据元素来描述一下微博的账号,我们把一个账号的信息看做一个数据元素,而昵称,性别生日看做数据项,其中生日由年月日组成,我们把它称为。我们把一个人的财富信息成为一个数据元素,而姓名,财富,财富来源等我们成为数据项。同样的数据元素可以组成相同的数据结构,而不同的数据元素也可以组成相同的数据结构。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的。的数据元素的集合,是。
2024-07-04 16:45:01
430
1
原创 函数指针数组的实践:转移表
把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。然后我们再思考一个问题,第一个代码有很多重复的部分,我们有没有什么办法把这些重复的部分统一表示一下呢?所以我们利用函数指针数组重新实现计算器,代码清晰有条理而且很简单。可以看出这样的代码繁琐且冗长。函数指针数组的⽤途:转移表。我们先实现一下简单的版本。
2024-02-06 16:33:56
413
原创 深入理解指针(2)
我们创建地str1数组存储hello bit,先创建一块空间 str2数组存储hello bit又创建一块空间 ,但是这两块空间是截然不同的两块空间,而str3和str4都是指针变量,指向的是常量字符串,而常量字符串不可以改变,所以没有必要创建两份,所以创建一份还可以节省空间。另外str1,str2,str3,str4都是创建在栈区的,而指向的hellobit.是在静态区的。存放的是整形变量的地址,能够指向整形数据的指针。首元素就是第一行,第一行的地址就是首元素的地址,第一行的地址就是数组指针的地址。
2024-02-06 14:48:41
405
原创 深⼊理解指针1(指针和数组)
其实我们知道数组在传参时传递的是数组名arr,也就是数组首元素的地址,所以在进行sizeof(arr)计算时计算的是⼀个地址的⼤⼩(单位字节)⽽不是数组的⼤⼩(单位字节),正是因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。同理arr[i] 应该等价于 *(arr+i),数组元素的访问在编译器处理的时候,也是转换成⾸元素的地址+偏移量求出元素的地址,然后解引⽤来访问的。,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)
2024-02-02 14:59:54
1029
原创 指针初步1
在指针类型中有⼀种特殊的类型是 void* 类型的,可以理解为⽆具体类型的指针(或者叫泛型指针),这种类型的指针可以⽤来接受任意类型地址。变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。这里实际上没有交换成功的是x和y确实接收到了a和b的值,但是x,y和a,b的地址不一样相当于x和y是独⽴的空间 ,自然无法实现交换,但是我们如果把地址传过去呢?• const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。
2024-01-31 20:51:55
958
原创 操作符详解
表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。同上,操作符的优先级只能决定⾃减 -- 的运算在 + 的运算的前⾯,但是我们并没有办法得知, + 操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。2进制和10进制是类似的,只不过2进制的每⼀位的权重,从右向左是: 2 , 2 , 2 ... 0 1 2如果是2进制的1101,该怎么理解呢?各种运算符的优先级是不⼀样的。
2024-01-30 21:30:59
1156
1
原创 经典例题:打印素数
首先我们要了解一下什么是素数,素数指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数就叫做素数。所以我们就可以想到利用for循环嵌套来解决本题,判断该数是否能在。利用上面实现的is_prime函数,打印100到200之间的素数。实现一个函数is_prime,判断一个数是不是素数。
2024-01-29 16:41:35
209
原创 经典例题:打印乘法表
首先我们可以先看一下9*9乘法表,我们发现先用for循环打印行数,再嵌套一个for循环进行列的打印即可实现。如:输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定。
2024-01-29 10:53:50
299
原创 经典例题:水仙花数的实现
首先我们要先分析一下这个数有多少位数,所以我们用count来计数。然后我们还要得到这个数的每一位数字,并且调用pow函数来计算该数的位数次方和原数进行比较即可。“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。求出0~100000之间的所有“水仙花数”并输出。实际上我们得到的并不全是水仙花数 ,而是自幂数。
2024-01-28 22:40:57
417
原创 C++中的引用
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了。总结:通过引用参数产生的效果同按地址传递是一样的,引用的语法更清楚简单。在函数形参列表中,可以加const修饰形参,防止形参改变实参。作用:函数传参时,可以利用引用的技术让形参修饰实参。本质:引用的本质在c++内部实现是一个指针常量.作用:引用是可以作为函数的返回值存在的。* 引用在初始化后,不可以改变。注意:不要返回局部变量引用。作用:常量引用主要用来修饰。2.1 引用的基本使用。2.3 引用做函数参数。
2024-01-23 19:05:21
461
1
原创 C++内存分区模型
存放 CPU 执行的机器指令代码区是**共享**的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete。代码区是**只读**的,使其只读的原因是防止程序意外地修改了它的指令。:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程。* 常量区中存放 const修饰的全局常量 和 字符串常量。C++程序在执行时,将内存大方向划分为**4个区域**
2024-01-22 20:53:28
548
1
原创 C++类与对象之多态
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容。* 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名。* 动态多态的函数地址晚绑定 - 运行阶段确定函数地址。静态多态的函数地址早绑定 - 编译阶段确定函数地址。* 子类必须重写抽象类中的纯虚函数,否则也属于抽象类。* 动态多态: 派生类和虚函数实现运行时多态。因此可以将虚函数改为**纯虚函数*** 都需要有具体的函数实现。
2023-12-18 17:50:47
638
1
原创 C++类与对象之运算符重载
好久不见,最近很忙,今天我们来学一下C++中非常重要的一部分:运算符重载。我们知道递增运算符有两种,我们先写一段代码复习一下递增运算符的基本用法。:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。这里a先赋值,所以a++为0,之后在加1,得到1;让我写代码带大家实现一下。既然大家都知道了,我们开始重载递增运算符的讲解。3. 默认拷贝构造函数,对属性进行值拷贝。1. 默认构造函数(无参,函数体为空)2. 默认析构函数(无参,函数体为空)计算⼝诀:先+1,后使⽤;口诀:先使⽤,后+1。
2023-12-16 23:43:25
142
2
原创 数组排序的方法
是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置知道未排序元素个数为0。2>再从剩余未排序元素中继续寻找最小(大)元素,然后放到未排序序列的起始位置。每一轮依次比较当前元素和后面的元素,如果当前元素比后面元素大,则交换他们的位置。1>首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。3>重复第二步,直到所有元素均排序完毕。总共需要比较n-1轮。
2023-12-12 23:33:25
93
1
原创 C++基础之类与对象
老铁们,为了应付一下即将来临的期末考试,我出一期C++中类与对象的博客,大家可以参考一下,希望有所帮助,来喽!人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭、唱歌...车也可以作为对象,属性有轮胎、方向盘、车灯...,行为有载人、放音乐、放空调...具有相同性质的==对象==,我们可以抽象称为类,人属于人类,车属于车类。C++认为万事万物都皆为对象,对象上有其属性和行为。
2023-12-11 21:34:31
365
2
原创 C语言数组查找的方法
上一个章节我们讲完了数组的概念和基本用法,接下来我会为大家仔细的讲解数组的查找和排序方法,代码稍微有点复杂,但相信大家一定掌握的,来喽!这是顺序查找的排序部分,我们用for循环访问数组,在挨个查找目标数字,如果找到该数字,则返回该数组的下标,没有该数字就返回-1.下标为4对应的数字为5,5<7,则5左边不会有7,则再次从6开始查找,这样查找的范围缩小了一半,所以叫做二分查找或折半查找。再进行(5+6)/2=5,对应的数字为6,6<7,这样被查找的范围只剩下了7,即7可以被找到。1.找出数组的中间元素。
2023-12-11 17:26:43
2194
4
原创 数组初步1
type 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以⾃ 定义的类型。[ ] 中的常量值是⽤来指定数组的⼤⼩的,这个数组的⼤⼩是根据实际的需求指定就⾏。数组也是有类型的,数组算是⼀种⾃定义类型,去掉数组名留下的就是数组的类型。这个程序的思路就是利用for循环来产生0-9的下标,再通过数组来访问。,数组在创建的时候,我们需要给定⼀些初始值值,这种就称为初始化的。• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。arr_name 指的是数组名的名字。
2023-12-10 21:02:15
155
3
原创 分支与循环实践:猜数字游戏的实践
我们就不难发现,其实rand函数⽣成的随机数是伪随机的,伪随机数不是真正 的随机数,是通过某种算法⽣成的随机数。之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1。rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是 依赖编译器上实现的,但是⼤部分编译器上是32767。我们可以看到虽然⼀次运⾏中产⽣的5个数字是相对随机的,但是下⼀次运⾏程序⽣成的结果和上⼀次 ⼀模⼀样,这就说明有点问题。
2023-12-09 23:36:17
155
2
原创 第3讲:分⽀和循环(上)
上⾯的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if 语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if 进⾏匹配的,这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不 成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。,if语句为真,则打印成年了, if语句为假,则不打印,对于 printf("可以谈恋爱了\n");
2023-12-04 15:54:32
106
2
原创 第2讲:C语⾔数据类型和变量
其实每⼀种数据类型有⾃⼰的取值范围,也就是存储的数值的最⼤值和最⼩值的区间,有了丰富的类 型,我们就可以在适当的场景下去选择适合的类型。每⼀种数据类型都有⾃⼰的⻓度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量⻓度的不 同,存储的数据范围就有所差异。• 局部变量:在⼤括号内部定义的变量就是局部变量 局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤的。• 全局变量:在⼤括号外部定义的变量就是全局变量 全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的。
2023-11-23 11:23:19
89
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人