自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 排序(9.17)

但是这种方法仅适用于需要递归的目标数组的成员为。

2024-02-26 19:47:41 1656 2

原创 二叉树-堆(9.10)

接上节内容的存储方式为数组存储,而如果使用数组存储会有许多空位,造成空间的浪费。完全二叉树/满二叉树 节点的下标之间的关系:小堆的插入:在数组上尾插,再判断与所有祖先节点的大小,刚好大于父亲节点,无需改变。在数组上尾插,发现小于父亲节点,就要找到父亲节点并与它交换位置(数组中和逻辑结构中均交换)小于哪一个祖先节点就当它的父节点,其余子孙节点依次往下移。现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整 成一个。向下调整算法有一个。

2023-11-14 17:25:07 73

原创 二叉树(9.7)

的。为什么称树是递归定义的?因为递归定义是将大问题一步一步化成类似的小问题最后解决并逐步返回的,而树也能拆成若干个子树,最终拆到叶节点就不能再拆了。

2023-10-31 16:48:58 291

原创 队列(8.6)

队列的特性与栈恰恰相反,。实现方式上有数组和链表,链表更有优势,因为数组取元素的时候比较麻烦。应用场景有公平性排队(抽号机),BFS(广度优先遍历)等。将队列运用于抽号机能够计算出排队需要的等待的时间,需要等待前面的人数等信息,也能实现叫号(取队头)操作,能够实现绝对的公平,不存在插队现象。队列的实现通过不带头单向不循环链表,同时需要头节点和尾节点来管理入队列和出队列。

2023-10-29 18:37:42 128

原创 栈和队列(8.4)

思路:由于左括号需要以正确的顺序闭合,栈的特性完美适配这一要求:我们创建一个栈(栈的基本操作我们直接cv前面的代码),将左括号入栈,然后取栈顶,与栈外的右括号相匹配,如果刚好完全匹配没有剩余,则为有效,相反,左括号或右括号中任一有剩余则为无效。如果初始化为 0,入栈一个数据 top ++,意味着 top 是栈顶元素的下一个位置。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。后入栈的数据先出来,例如存入1,2,3,出栈的顺序是3,2,1。出栈:栈的删除操作叫做出栈。//支持动态增长的栈。

2023-10-23 11:35:48 67

原创 链表收尾(8.2)

这样做的目的是方便找 random 节点,知道原节点可以找 random,知道上一个 random 可以找下一个 random。我们可以通过原节点的 random 轻松找到拷贝的 random。3.将拷贝节点与原链表解开,尾插到一起,并恢复原链表的链接。2.放置每个拷贝节点的 random。4.顺序表和链表的区别。

2023-10-21 17:45:27 94

原创 双向链表(8.2)

申请一个节点 newnode,将它与尾节点和头节点链接起来,让尾节点的 next 指向newnode, newnode 的 prev 指向尾节点,newnode 的 next 指向头节点,头节点的 prev 指向 newnode。注意链接的顺序,先链接新节点和后一个节点,再链接新节点和头节点,如果颠倒这个顺序,将导致后头节点与后一个节点的链接被覆盖,就找不到后一个节点了。找到尾节点和尾节点的上一个节点,将尾节点释放掉,将尾节点的上一个节点与头节点链接起来。是带头双向循环链表。实际中使用的链表数据结构,都。

2023-10-20 14:47:21 575

原创 链表 oj2 (7.31)

若 M 为奇数,距离最小时为 -1,即fast 超过了 slow 一步,此时又要观察环的长度C,此时 slow 和 fast 的距离为 C-1,若 C 为奇数,C-1为偶数,那么再经过一轮追击之后就能刚好追上。此题目用带哨兵位的链表做更加简单,因为尾插时不用考虑链表是否为空的情况,将两个链表链接的时候也不需要考虑其中一个链表为空的情况了(即不用担心链表为空的情况)。哨兵位就是不带数据的头节点,且为固定的节点,当链表为空时,带哨兵位的链表(右)存在一个头节点(空间),而不带哨兵位的链表(左)则没有节点。

2023-10-18 16:24:12 773 1

原创 链表oj (7.29)

正常的删除需要 cur(待删除节点)和 cur 前面一个节点 prev ,让prev 指向 cur 的下一个节点,然后释放掉 cur节点,再让 cur 指针指向现在 prev 指向的下一个节点(原来 cur 指向的下一个节点)。比较两个链表相同位置节点的大小,较小的一方就头插到新链表中,直到有两个链表中的其中一个先走到了空,结束插入,将有剩余的链表链接到新链表。定义一个 cur 指针遍历原链表,把不是 val 的节点,尾插到头节点为 newhead 的新链表,是 val 的节点,就释放掉。

2023-10-14 16:46:49 86

原创 链表(7.27)

原理:创建一个新节点,先通过局部变量 tail 遍历找到指向的下一个节点为空的节点(即倒数第二个节点),然后将该节点与新节点链接起来。但这个做法对吗,显然不对,形参是实参的一份临时拷贝,改变形参不影响实参,出了这个作用域,这两个指针就销毁了,plist也没有改变。再删掉就为空,这时候就需要释放节点的空间,并将头指针置空,就涉及到了头指针的改变,需要引用二级指针。plist 是结构体类型的指针,要改变它的值,在函数中就需要传它的地址,也就是指针的地址。上面的步骤是在原有链表的前提下进行的,如果链表为空呢?

2023-10-10 16:02:23 265

原创 初识链表(7.25)

3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到 200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。2. 增容需要申请新空间,拷贝数据,释放旧空间。在链表中的空间是多段不连续的,空间之间也没有大小关系,链表也定义一个。节点的空间是从堆上随机申请的,两次申请的空间可能连续,可能不连续。以往在数组中内存空间是连续的,通过一个指针和。,第一个空间中存放一个指针指向第二个空间,、非顺序的存储结构,数据元素的。链表在内存中是什么样的呢?

2023-10-07 21:06:47 156

原创 顺序表(7.24)

个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

2023-09-30 19:34:00 122

原创 复杂度(7.23)

一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知 道。在计算机发展的早期,计算机的存储容量很小。第一次将最大的数移动到最右边需要比较n-1次,第二次n-2,第三次... ...,这是一个等差数列,用公式求n项和,为(N-1)*N/2,因此时间复杂度为O(N^2)。该数列是有序的,从中间位置开始查找,如果要找的值更大或更小,就缩小一半查找范围,缩小一次,下一次查找的数量就除2,那么。相同为0,相异为1,相同的数只要放在一块进行了异或,就为0,与顺序无关。

2023-09-26 17:41:02 81

原创 寻找单身狗

由此我们容易知道两个相同的数,进行异或运算得到的结果一定为 0,0和非0数字异或的结果为非0数字,因此我们可以将数组中的所有元素都进行异或,出现过两次的数异或结果将为0,留下来的就是单身狗了。如果数列中存在两个单身狗,依然和上面一样全部进行异或运算显然是得不到答案的,相同的数通过异或消除了,得到的会是两个单身狗异或的结果。在一个数组中仅出现一次,其他数均出现两次,这个出现一次的数就被称为“能不能将两个单身狗分开,在两个数组中分别以上面的方式找出单身狗呢?,它的特点是对应二进制位。异或的条件是对应二进制位。

2023-09-22 17:04:27 175

原创 打印杨辉三角形

1.杨辉三角形每行的第一和最后一位都为1。2.第n行就有n个数,即行数等于列数。3.中间非1的数,值等于上一行同列的数和上一行上一列的数之和,即“肩上”两个数之和。

2023-09-16 17:01:34 119

原创 猜名次

3.对这些组合进行筛选,条件为每位选手说的话的正确性都为1,同时每位选手需要在不同的名次,通过每位选手的排名之积为120来实现。1.每一位选手说对一半,就说明每个选手说的两句话,一句为1(对),一句为0(错),和为1。2. 五位选手,各占一个不同的名次,因此可以用一个五层嵌套循环,遍历出所有可能的成绩组合。

2023-09-14 19:54:53 43

原创 预处理详解2(7.17)

在编译一个程序的时候,如果我们使用条件编译指令,那么我们要将一条语句(一段语段)编译或者放弃是很容易的,以此让一个文件的代码可能适用多个场景或平台。如果满足 #if 后面的条件语句,那么直到 #endif 的语段都编译,不满足就不编译并删除该语段(预处理阶段)。在头文件开头加上这些内容,判断是否被定义,如果未被定义,则进行定义,并编译头文件中的内容。头文件的包含有两种方式,包含自己的文件用“ ”,包含库里的文件用< >。是的,不过这样查找的效率低一些,并且也不容易区分是库文件还是本地文件。

2023-09-05 08:57:40 45

原创 编译+链接(7.16)

生成的目标文件是按照 elf 格式来组织的,这种格式将文件分成很多段,两个目标文件链接生成的可执行文件也是 elf 格式的,意味着会将相同段的数据进行合并后放到可执行程序中。进入宏先比较 a,b 大小,此时a=5,b=6,比较完之后各自++,此时a=6,b=7,比较结果为假,执行b++,将b的值赋给c,此时c=7,赋值之后b++,此时b=8。宏参数的求值是在所有周围表达式的上下文环境中的,如果不加上括号,临近操作符之间的优先级可能产生不符合我们预期的结果,因此建议宏在书写时多加符号。

2023-09-04 09:24:54 43

原创 文件操作(7.15)

而对于文件来说,不可能默认打开,因此对文件进行操作时,需要我们手动打开和关闭。每打开一个文件,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,并且时刻跟随其变化,无需关注细节。从指针s提取格式化的数据放到后面去, . . .叫做可变参数,对应数量不确定的参数,多少个%格式就对应多少个参数。但有时候我们会将信息输出到磁盘上,当需要的时候再从磁盘上将数据读取到内存中使用,这里处理的就是磁盘上的文件。feof 的作用是当文件读取结束的时候,判断读取结束的原因是否是:到达文件末尾结束。

2023-08-22 21:18:42 47

原创 通讯录

希望打印多少位宽,就将宽度设置如 20%s,有负号为左对齐,无符号为右对齐。

2023-08-18 16:48:19 87

原创 动态内存管理(2)

错误1:str 是char*类型的指针,传参给GetMemory函数,函数同样用char*类型的指针接收(传值调用,传的是变量本身),此时的 p 为形参,是实参 str 的一份临时拷贝,函数为 p 开辟了一块动态内存空间,但改变形参不会影响实参,因此当函数返回时, str 仍是空指针,不可能将字符串拷贝到空指针。用 str 指针接收函数中创建的字符串的地址,但是当函数返回时,字符串的空间就被销毁了,此时指向字符串的 str 就成了野指针,对野指针解引用会导致非法访问。4.代码能否正常运行。

2023-08-17 17:41:47 36

原创 动态内存管理

malloc在堆区上申请空间后,直接返回这块空间的地址,不会初始化空间的内容,所以看到的是随机值(不同于栈区)如果需要减少空间,第二个参数就在原空间上减小,如果减少的空间内包含原有的数据,那么数据将会丢失。但它们的内存空间大小是不能改变的,数组的空间会出现大了用不完浪费,和小了不够用的情况。空间开辟失败的情况:需要开辟的空间过大,如INT_MAX。后面有足够空间的情况下,直接在p指向的空间后面继续申请空间。如果找不到合适的新的空间开辟,则开辟失败,返回NULL。后面的空间不够,则寻找新的合适空间开辟。

2023-08-16 19:45:27 87

原创 自定义类型详解:结构体,枚举,联合

数据域是用来存放数据的,指针域存放的是下一个同类型结构体的指针,通过该指针能够找到下一个同类型结构体。c 和 i 公用一块空间,最小是最大成员的大小5,而联合体的大小是最大对齐数的倍数,最大对齐数为4,因此结果为5+3(浪费)=8。i 需要对齐到自身大小4的倍数, c2 对齐到自身大小1的倍数,而结构体的大小必须是最大对齐数4的整数倍,因此为12。以上的星期,性别,颜色都是枚举类型,{ }中的内容是枚举类型的可能取值,也叫枚举常量。上面的写法是不能求得大小的,因为结构体中包含结构体,无线循环。

2023-08-11 21:12:49 29

原创 内存函数

拷贝有重叠的空间中的内容,如果被拷贝内容在拷贝内容之后(将后面的内容拷贝到前面),即dest>src,需要从后往前拷贝;逐字节比较,比较结果相等返回0,ptr1<ptrr2返回<0的数字,ptr1>ptr2返回>0的数字。如果被拷贝内容在拷贝内容之前(将前面的内容拷贝到后面),即dest<src,需要从前面开始拷贝;作用:将source指向的前num个数据拷贝到destination中去。但如果用 memcpy来拷贝重叠的空间中的内容,那么得到的结果是错误的。需要注意返回值和函数接收参数的限制。

2023-08-09 19:39:46 32

原创 字符串和内存函数(1)

第一步++,在第一问中cpp已经++过一次,再其基础上再次++,结果是cpp指向cp中的第三个元素,第二步解引用,通过指针找到cp中的第三个元素,值为char**类型的指针,指向的地址为c+1,第三步--,该指针的值 -1,指向c的第一个元素,再次解引用,得到c的第一个元素,内容为指向ENTER的指针,第四步 +3,该指针向后移动3位,得到的值为ER。stryok中的第一个参数不为NULL时,会找到 str 中的下一个标记符号,将其改成 '\0',并保存这个位置,返回指向其之前字段的指针。

2023-08-07 21:27:29 28

原创 指针进阶3

a[5][5]为五行五列的二维数组,p为 int(*)[4] 类型的指针数组,a为二维数组的首元素地址,类型为int(*)[5],将该地址赋给p,p每+1-->p[1]-->*(p+1),就跳过4个整型,这里将p[ ][ ]也看作二维数组,p[4][2]则为第五行数组的第三个元素。问1:&a是取出整个数组的地址,+1就是跳过整个数组,再强制转换为 int* 类型指针, ptr[-1] 等于 *(ptr1-1),对它解引用操作就是往回移动一个整型,得到一个16进制的整型04 00 00 00。

2023-08-04 21:10:44 30

原创 指针进阶(2)

回调函数 通过 传参 接收 目标函数的指针,通过该指针访问目标函数实现功能,通过回调函数能够实现访问多个 参数类型 和 返回值类型 相同的函数,实现多种功能,具有通用性。交换,传递参数应该有两个值的指针, 函数的参数应该有两个char*类型指针,还需要size,也就是该类数据的大小(字节)。问题2:不同类型的数据比较的方式不同 解决:将两个元素的比较方法,以函数参数的形式传递(回调函数)1.是当使用多个返回类型和参数类型相同的数组时,添加新的函数更方便。7.指向函数指针数组的指针。

2023-08-02 19:29:55 34

原创 指针进阶(1)

这一操作是分别创建了两个内容相同的字符串,而数组名通常情况下为字符串首元素地址,两个数组的首元素地址一定是不同的。这一操作是创建了两个指针变量,它们都指向同一个常量字符串的首元素,常量字符串是不能改变的,因此两个指针变量是相同的。形参写成数组,但本质上仍是指针。地址传参应该用指针接受,数组传参都是传地址!不是将整个字符串放到指针变量里,只是将首元素的地址放到指针变量里了。如果指针指向数组(数组指针),+1跳过整个数组。如果指针指向元素(整型指针),+1跳过一个元素。分辨指针数组与数组指针。

2023-07-31 20:51:27 32

原创 数据在内存中的存储2

科学计数法中可以出现负数,但内存中E为无符号整数(恒为正),因此存入E时候要加上127(32位),1023(64位double)以保证存入的数为正,读取的时候减去对应值。因为是一个非常小的数字, 浮点数的E为-126或者-1022,有效数字M前面补0.而不再补1.S决定正负,M是科学计数法表示的大于等于1小于2的小数,E代表缩写的二进制位数。知道S,M,E的值,就能还原一个浮点数,因此存储的时候就是存储S,M,E。舍弃一个默认的1,多保存一位有效数字,在读取的时候加上第一位1。浮点数在内存中的存储。

2023-07-30 19:11:45 42

原创 进阶:数据在内存中的储存

低位字节 放 低地址,高位字节 放 高地址 则为 小端 字节序存储。char类型能存放的数的大小是有限的(-128—127),当超过这个限度,就会开始循环。低位字节 放 高地址,高位字节 放 低地址 则为 大端 字节序存储。低位 到 高位 指的是 个位- 十位- 百位。有符号位的8位二进制序列整型提升:左边按符号位布满。编写代码判断机器是小端字节序存储还是大端字节序存储。原码到补码可以取反加一,补码到原码也能取反加一。查看数据类型的最大最小值:(转到定义)

2023-07-29 16:50:08 57

原创 实用调试技巧2

左边: 当const放在*左边的时候,限制的是指针指向的内容,因此不能通过指针改变指针指向的内容,但指针变量本身可以改变。发现release版本中,i在栈中的位置处于数组的下方了,而栈内的访问是从下方往上方(低地址到高地址)的,因此不会发生死循环。右边:当const放在*右边的时候,限制的是指针变量本身,因此指针变量不能改变,但可以通过指针改变指针指向的内容。当我们不希望某事件发生的时候,使用assert(断言),发生了就报错。无符号类型的值总是>0的,可以将int都改成size_t。

2023-07-28 16:39:46 37

原创 实用调试技巧

可以发现在求3的阶乘开始之前,ret的仍值为2,正确情况下应该初始化为1,因此我们将ret的赋值放进循环。F9断点的作用:当怀疑某一行代码有问题,可以在该行设置断点,能让程序执行(F5) 到该就行停止执行。3.3.5查看寄存器信息可以通过上图,或者在监视窗口中直接输入寄存器名。当断点设置在循环中,并需要在一定条件下触发,可以右键断点,设置条件。在F10进入调试之后,在调试--窗口中可以看到。代码的运行结果跟正确答案不同,进行调试。3.3调试的时候查看当前程序的信息。3.windows环境的调试介绍。

2023-07-26 21:03:37 29

原创 结构体

出现问题,原因是使用了传值调用,初始化结构体的时候只改变了形参,实参未改变。所以结构体传参的时候,要传地址。1.4结构体变量的定义和初始化。1.1结构的基础知识。用结构体描述一个学生。2.结构体成员的访问。

2023-07-25 20:41:56 27

原创 指针初阶2

作用是用于存放一级指针的地址。和二维数组类似,但不同。指针和数组之间的关系。

2023-07-25 14:46:16 32

原创 指针初阶

在32位机器上,地址是由32个0或1组成的二进制序列(32bit位),需要四个字节的空间来储存,因此一个指针变量的大小为4个字节。int类型指针加1,跳过sizeof(int)即4个字节,char类型指针加1,跳过sizeof(char)即1个字节。那么32跟地址线产生的地址就有 2^32 次方个,每个地址标识一个字节,那我们就能对4GB的空间进行编址,对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平或低电平(对应0和1)因此a的大小为32个bit位,即4个字节。

2023-07-22 21:38:15 28

原创 作业纠错

逗号表达式的结果是后者(一个元素),一个整型大小为4个字节,因此结果为4*4。c.arr[10]是第11个元素,而该数组只有10个元素,会造成越界访问。

2023-07-20 14:55:25 31

原创 操作符详解2

c语言的整型算数运算总是以默认的整型类型来进行的,为了实现,表达式中的字符和短整型操作数在使用之前会被转换为普通整型,这种转换成为整型提升。有符号的数字最高位被规定为符号位,无符号数字的每一位都是有效位。从左到右依次计算,整个表达式的结果是最后一个表达式的结果。计算时,下面数据类型的操作数转换为上面数据类型的操作数。表达式1为真,表达式2的计算结果为整个表达式的结果。括号优先级最高,赋值操作符的优先级很低,用的时候查表。表达式1为假,表达式3的计算结果为整个表达式的结果。可变参数列表即参数的数量不确定。

2023-07-19 17:22:02 26

原创 操作符详解1

一个数的每一位都有其权重,3的权重为10^0,所表示的值为3*10^0,2的权重为10^1,表示的值为2*10^1,1的权重为10^3,表示的值为1*10^3,加起来则为该数的十进制数。用a&1来判断最低位是否为1(按位&有0则为0,全为1才为1),判断一次,将a右移一次,再判断,判断为1计数器就+1.将a转换为2进制数,并求出补码,再计算:整体右移,将右边多出部分丢弃,左边空缺用原来的符号位填补。正数,补码与原码相同,答案为1*2^0+1*2^1等于3。arr[10]是整型数组,大小为4*元素个数。

2023-07-17 20:17:43 52 1

原创 纠错 5.8

在一个函数内符合语句中定义的变量在本函数范围内不一定有效,出了括号就无效了。A.高内聚低耦合(函数间)即为尽量实现功能上的独立。不可以无限递归,递归层次太深,也会出现栈溢出的现象。B.形参是在函数调用时才实例化,才开辟内存空间。B.函数的实参可以是 常量,变量,表达式,函数。D.主调函数和被调函数可以不在一个文件中。C.函数间的数据传递可以使用全局变量。D.函数的定义是说明函数是怎么实现的。复合语句:函数中的成对括号中的代码。A.形参是实参的一份临时拷贝。A.函数可以没有参数和返回值。

2023-07-15 15:36:22 56 1

原创 游戏扫雷

为了避免与显示雷个数的数字产生矛盾,我们使用两个二维数组,一个存放布置好的雷的信息,一个存放排查出的雷的信息。注意:在9*9棋盘下,处于棋盘边缘的位置在在遍历统计雷数量的时候会出现越界访问,因此给棋盘的边界都加1格,采用11*11的棋盘。要排查某个坐标附近雷的个数,可将雷设置为‘1’,不是雷设置为‘0’,将字符转换为数字后加起来即可实现,无需一一遍历进行判断。选择一个点扫雷,如果是雷,则被炸死,游戏结束;如果不是雷,则显示如下关系图。数字代表该坐标周围的8个坐标中存在雷的个数,颜色区域为可能存在雷的区域。

2023-07-13 21:03:27 43 1

空空如也

空空如也

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

TA关注的人

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