自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 24/07/18数据结构(7.1220)队列实现

队列:只允许在一端插入数据操作,在另一端进行删除数据操作的线性表,队列具有先进先出FIFO(first in first out)栈 队列:元素的操作和访问顺序有一定的规则(所以它们不提供遍历操作,否则和上面两个没啥区别了)含有尾指针的单链表,尾插O(1) 头删O(1)链表:单链表尾插O(N) 头删O(1)头插:insert(header -> next)顺序表:尾插O(1) 头删O(N)头删:erase(header -> next)尾删:erase(header -> prev)插入,删除:O(1)

2024-07-18 12:47:36 364 1

原创 24/07/11数据结构(6.1215)双链表实现-栈实现

/尾插 O(1) //给头的前面插一个数据ListInsert(lst, lst->_head, val);//尾删://删除头的前一个节点 ListErase(lst, lst->_head->_prev);//头插//ListInsert(lst,lst->_head->_next,val);顺序表优劣:优:空间连续,支持随机访问,空间利用率高不容易造成内存碎片,尾插尾删效率高.//头删//ListErase(lst,lst->_head->_next);出栈:栈的删除操作叫做出栈,出数据也在栈顶。

2024-07-11 12:45:45 1014

原创 24/07/10数据结构(5.1213)链表OJ

要求:如果链表中有某节点,可以通过连续跟踪next指针再次到达,则链表中存在环.为了表示给定链表中的环,我们使用证书pos来表示链表尾链接到链表中的位置(索引从0开始).如果pos是-1,则在该链表中没有环.注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况.如果链表中存在环,则返回ture,否则返回false.11.给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中任何节点或者空节点.要求返回这个链表的深度拷贝。//如果待插入数据小于有序数据的最后一个数据需要遍历。

2024-07-10 18:09:35 971

原创 24/07/10数据结构(4.1209)单链表OJ

3.给定一个带有头结点head的非空单链表,返回链表的中间节点.如果有两个中间节点,则返回第二个中间节点.5.将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的.输入:1->2->6->3->4->5->6, val = 6。输出:NULL->5->4->3->2->1。输出:1->1->2->3->4->4。示例:输入:1->2->3->4->5->NULL。示例:输入:1->2->4, 1->3->4。

2024-07-10 12:32:31 884

原创 24/07/09数据结构(3.1206)数组OJ单链表实现

给定 nums = [0, 0, 1, 1 ,1, 2, 2, 3, 3, 4],函数应该返回新的长度5,并且原数组 nums 的前5个元素被修改为0, 1, 2, 3, 4。对于非负整数X而言,X的数组形式是每位数字按照从左到右的顺序形成的数组.例如,如果X = 1231,那么其数组形式为[1, 2, 3, 1]nums2 = [2, 5, 6], n = 3 输出[1, 2, 2, 3, 5, 6]示例: 输入:[1, 2, 3, 4, 5, 6, 7] 和 k = 3。

2024-07-09 18:58:58 508

原创 24/07/08数据结构(2.1203)顺序表实现

/1.移动元素:(pos,size),从pos + 1开始,从前往后依次移动。//需要动态开辟的数组。//如果元素个数和容量相同,说明空间满了,需要扩容空间。//如果元素个数和容量相同,说明空间满了,需要扩容空间。//头删: 移动元素:[1,size)全部向前移动一个位置。//头删: 移动元素:[1,size)全部向前移动一个位置。

2024-07-08 17:16:37 799

原创 24/07/02数据结构(1.1201)算法效率顺序表

空间复杂度是一个算法在运行过程中临时占用存储空间大小的度量.空间复杂度不是程序占用了多少字节的空间,它计算的是变量的个数,基本和时间复杂度类似,也是用大O渐进法表示.线性表在逻辑上是线性的,也就是连续的一条直线,但它在物理结构上不一定是连续的,如果物理结构上连续是顺序表,如果物理上不连续就是链表.F(N)-->F(N-1)-->F(N-2)-->...-->1.需要N个递归调用,所以它的时间复杂度O(N).最坏:F(n):n(n+1)/2 = 1/2 * n ^ 2 +1/2 * n。

2024-07-02 21:54:04 591 2

原创 24/06/29(21.1205)程序的编译和链接

链接器同时也会引入标准函数库中任何被该程序所用到的函数,而且它可以按照程序员个人的程序库将其需要的函数也链接到程序中..i 生成预处理文件gcc -o test.i -E tesr.c (展开头文件 #include<>;2.#include<filename.h>和#include"filename.h"有什么区别。.s 汇编文件 gcc -o test.s -S test.i(进行语法检查,生成汇编文件)gcc -o test.o -c test.s 生成目标文件。./执行文件test。

2024-06-29 12:14:37 170

原创 24/06/27(22.1129)文件读写

学习结构体时,可以通过给程序实现增删改查,这时的数据存放在内存中,当程序退出的时候,通讯录中的数据也就不存在了,等下次运行程序又要重新录入.使用文件可以将数据直接存放在电脑硬盘上,做到了数据的持久化.在文件读取过程中,不能用feof函数的返回值来直接判断文件的是否结束,而是应用于当文件读取结束时,判断是读取失败结束,还是遇到文件尾结束.文本文件函数:fopen();1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)fprintf(fp,"%d ",arr[i]);

2024-06-27 13:52:10 329

原创 24/06/26(1.1129)动态内存

/会把申请的空间初始化。但是对于空间的需求,不仅是上述情况,有时候需要空间大小在程序运行的时候只能试试动态内存开辟了.//在栈空间上开辟十个字节的连续空间。2.数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。//柔性数组成员 不占空间。static静态常量区:(静态定义的对象,字符串常量)//在栈空间上开辟四个字节。被初始化的在.data段即数据段(在静态常量区).stack栈区:(局部变量,函数的参数)

2024-06-26 19:43:44 906

原创 24/06/26(12.1125)自定义类型,动态内存管理

使用位域使本来要开辟三个字节变成只开辟一个字节,(因为一个字节8个位,这才用了三个){ //在struct之后写了字母t,它从成员变成了类型。在没有特殊要求的情况下,让占用空间小的成员在一起,就是从小到大写.//自定义类型有一个对齐值(内部当中最大的类型,比如下面的8)如果不给里面元素赋值,那么默认后一个的元素是前一个元素+1。//基本数据类型有一个对齐值,就是它自身的大小。//在C里依然是32,C++里类型不占大小。//下面输出的结果是什么。//下面输出的结果是什么。

2024-06-26 12:38:37 511

原创 24/06/25(4.1122)数据存储,自定义类型

/1010.001(小数化二进制的乘二取整法)0.125*2=0.25 -> 0;e全为0时 指数e=1-127,有效数字m不再加上第一位的1,而是还原为0.xxxxxxxx的小数,无限接近于0;//1111 1111 1111 1111 1111 1111 1111 0101反。计算机永远存储的都是补码,计算也是用补码进行的,只有在要输出的时候转化成原码.大端:数据的低位保存在内存的高地址,数据的高位保存在内存的低地址。小段:数据的低位保存在内存的低地址,数据的高位保存在内存的高地址。

2024-06-25 22:15:21 947

原创 24/06/25(13.1122)字符串内存函数

反码:1111 1111 1111 1111 1111 1111 1111 1011(符号位不变,其他取反)//对指针进行参数保护(使用一个临时指针代替)字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符长度。补码:1111 1111 1111 1111 1111 1111 1111 1100。(指向一个空间,空间里有一个空格和一个\0)char* str ="";(指向一个空间,空间里有一个\0)printf("str2 不存在");

2024-06-25 16:10:55 755

原创 24/06/24(12.1117)指针进阶 ,冒泡和快排 习题为依托巩固概念(strlen,sizeof,字符串,数组,指针大小的区别)

int Find(int arr[], int n, int(*pfun)(int arr[], int n)){//通用。

2024-06-24 18:53:42 613

原创 2024/06/24(11.1115)指针进阶

思路如上,来形容的时候要怎么说.fun是一个指针,这个指针是指向一个函数的,所指的函数为一个整型指针的参数和一个指针的返回值,返回的指针是指向一个具有10个元素的数组,每个元素的类型为整型指针. 它是返回值为数组指针的函数指针。一个指向函数的指针,该函数有一个整型参数并返回一个整型数int (*a)(int);一个有十个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数.一个有十个指针的数组,该指针是指向一个整型数的 int*a[10];

2024-06-24 13:28:29 927

原创 24/06/12(1212)Linux基础基本使用

Linux发行版:CentOS,Ubuntu,RedHat......Linux操作系统和Windows是并列的关系:那为什么要学Linux呢?公司中主要使用RedHat(收费).所以用CentOS.可以把写好的项目部署到云服务器上,使用链接或者二维码就可以看到.得到的云服务器不只是一个Linux环境,同时也是一个外网ip。Linux基本使用比较复杂(纯命令行操作)1.Linux基本使用(基础)2.Linux编程(重点)(2)为啥要学Linux。(3)Linux该怎么学。(1)什么是Linux。

2024-06-12 15:44:43 135

原创 24/06/12(1210)一些指针概念掌握情况测试/结构体

char就是一个字符.printf("%d\n", strlen(&arr + 1));

2024-06-12 11:13:04 649

原创 24/06/05(1206)指针

字符串大小的比较规则:先看第一个字符的ASCII值的大小.如果能分出大小,结果就确定了,如果第一个字符相同,再依次比较下一个字符的ASCII.字典序。void* 不能进行解引用,如果有些函数需要同时处理多种类型的指针的时候,使用 void* 就比较合适.一种特殊的类型,void*(不是空指针):只考虑指针的地址是啥,不考虑这块内存的大小.针对比较相等,这个还好. 规则就是比较两个指针中存的地址是不是一样的.虽然这样比较的依然是字符串的地址,但这两个共用同一个创建的字符串常量.

2024-06-05 17:18:05 765

原创 做的一些例题

printf("球体积为 %.2lf\n",(4 / 3) * pi * c);printf("球表面积为 %.2lf\n",4 * pi * b);printf("圆柱体积为 %.2lf\n",pi * b * h);printf("圆周长为 %.2lf\n",pi * 2 * r);printf("一次存两年再存三年 %lf\n", ret2);printf("一次存三年再存两年 %lf\n", ret3);printf("圆面积为 %.2lf\n",pi * b);

2024-05-29 17:52:08 759

原创 25/05/27(1202)指针

虽然输出结果为10 但是是有问题的:因为局部变量的生命周期在函数运行结束之后就结束了.申请的num开辟的内存也就释放掉了.之所以能够输出10是恰好这里的内存还没有被其他程序占用.内存必须先申请才能使用,没申请不能用.如果强行使用未申请的内存就会出现访问非法内存的情况,这这是一种常见的"未定义行为".平时写的程序都是应用程序,跑在系统之上.还有一些特殊的程序是跑在内核中的(驱动程序(显卡驱动/鼠标驱动)).指针也是一个变量,变量里存的就是一个整数,这个整数具有特定的含义,就是内存中的一个地址.

2024-05-27 17:01:03 627

原创 24/05/26(1128) 操作符和表达式

运用异或位:(还是运用异或的特性,如果一个数字接连出现两次就会异或抵消(所以也仅针对当前该数组同一个元素最多出现了两次)).CPU从内存读取数据的时候,并不是一个字节一个字节的读,而是四个字节四个字节的读.(整型提升)运算来说,如果左侧表达式的值已经是假了,此时整个表达式的值已经确定了.右侧表达式不需要求值.运算来说,如果左侧表达式的值已经是真了,此时整个表达式的值已经确定了.右侧表达式不需要求值.其中只有一个元素出现了一次,其他元素都出现了两次.写一个函数,把这个只出现一次的元素找到.

2024-05-26 15:36:20 677

原创 24/05/25(1125)操作符和表达式(算术操作符和移位操作符)

1."运行时出错"2."运行时进程异常终止"3."运行时CPU在执行 / 0指令的时候会导致操作系统触发一个异常,然后给当前进程发送一个信号,导致进程异常终止"2.当算术运算符两侧的操作数类型不匹配的时候,就会出发"隐式类型转换",先转成相同类型,再进行计算.(按位异或) 对应位进行计算.如果两个数字相同,结果为0,不同为1.(按位与) 对应位进行计算.如果都为1,结果为1,否则为0.(按位或) 对应位进行计算.如果都为0,结果为0,否则为1.(按位取反)针对当前操作数,遇到1得到0,遇到0得到1.

2024-05-25 11:17:07 625 1

原创 24/05/23(1125)部分 扫雷

主要是 C 语言的函数只有一个返回值,如果需要一个函数产生多个输出结果,只能通过输出型参数的方式来解决.printf("请输入要翻开位置的坐标(row, col):");printf("当前位置已经被翻开\n");printf("您的输入有误\n");printf("成功扫雷\n");printf("输入有误\n");printf("踩雷\n");printf("欢迎来到扫雷\n");printf("1.开始游戏\n");printf("0.退出游戏\n");printf("输入选择 ");

2024-05-23 17:41:51 894

原创 24/05/22(1122) 依然是一些数组收尾(没收完) 用数组编写三子棋和扫雷

printf("请输入您要落子位置的坐标(row col):");//5.检查当前位置是否是最后一个位置,如果是则游戏胜利。//尽可能的对用户的输入进行校验,如果发现输入数据非法。printf("恭喜扫雷完成\n");//当前位置已经有子了,不能重复落子。//3.提示玩家输入要翻开位置的坐标,并校验。//1.创建并初始化一个棋盘(字符类型的二维数组)printf("输入有误\n");printf("踩雷了\n");//判定棋盘是否满了,满了返回 1 ,否则返回 0 .printf("恭喜你 赢了\n");

2024-05-22 17:20:29 306

原创 24/05/21(1118) 数组

把数组中的{}换成()之后输出的结果变成了{2, 6, 0, 0},{0, 0, 0, 0},{0, 0, 0, 0}普通的数组只能使用{}初始化.字符数组处理使用{}还可以使用""的形式初始化,相当于在初始化一个字符串.本来就没有二维数组.所谓的二维数组,也是一个一维数组,只不过数组的每个元素,又是一个一维数组.无论是几维数组,定义的时候,永远只有第一个[]的数字可以省略,其他的都不能省略.//int a = (1, 2, 3);Linux,Apache(HTTP服务器),MySQL,PHP。

2024-05-21 17:05:51 934

原创 24/05/16(1115) 函数递归和数组概念回顾

函数调用也是有开销的,只不过这个开销比较小而一般忽略不计.但递归的调用非常频繁而不能忽略不计,所以平时编程中一般选择非递归函数.像arr1这个数组里面没有 \0 就不是一个字符串.不该对他使用strlen.如果强行使用,最终结果不可预期.这叫做未定义行为.(字符串是一种特殊的字符数组.必须以 \0 结尾)C语言设计中最大的败笔,就是这个字符串 \0 的设定.我们当前讨论的栈,是操作系统中的栈.和数据结构中的栈不一样.他俩的堆也不一样.计算时间非常长,数字太大了.使用非递归版本避免重复运算.

2024-05-16 17:18:26 509

原创 2024/05/14(1111) 函数

代码执行到 "int ret = Max(10,20)"调用函数Max"int Max(int x,int y)"令"x = 10 y = 20"代码往下执行if判断后return返回"y"继续回到"int ret = Max(10,20)".指针也是一种变量.变量里存的是一个整数.这个整数具有特殊的含义,是内存中的一个地址,根据这个地址找到这块内存,也就能读取或修改这个内存的内容了.//最后一个元素的下标。我们会发现一番操作下来我们在使"x"和"y"的值发生变化而"a""b"其实没有发生变化.

2024-05-14 17:16:09 523

原创 24/05/10(1108)git\github

2.每次提交给服务器的时候,引入了一个"版本"概念.服务上可以方便的查看当前都有哪些版本,并且跨苏可靠的切换代码到任意版本历史.a)git clone 把代码下载到本地. 安装git 通过右键菜单来使用(上文中提到的链接)git可以把代码提交到服务器上.对于商业项目来说,服务器肯定是公司内部的git服务器.github主要是给程序员进行一些非商业项目开发的时候来使用的服务器.1.git能够把本地的代码上传到某个服务器上.随时能够快速下载回来.d)git push 把本地的版本推送到服务器上.

2024-05-10 20:42:36 134

原创 24/05/10(1108) 调试技巧

1.打断点.程序执行到某一行代码,就让它停下来.让程序员看到中间结果.左键在行号之前单击,出现一个红色圆点.断点表示程序接下来要运行的代码.熟悉这两个操作之后可以尝试点击"调试"按钮"F11" "F12",继续"窗口" "自动窗口" "监视" "调用堆栈"等自行摸索.5.回归测试:再测试一下,程序中的bug是否真的被解决.也要尽可能保证改动的代码没有引入新的bug.3.确认原因(最重要的步骤).只要bug定位的准,原因分析一般比较简单.VS的调试器的用法.为了方便大家更高效的定位问题.

2024-05-10 15:02:59 300

原创 24/5/9 (1105)for循环基本概念,与while循环异同,for循环示例.经典编程题:N的阶乘,阶乘之

for循环基本概念,与while循环异同,for循环示例.经典编程题:N的阶乘,阶乘之和,撩门帘(字符从两端移动),输密码,二分查找在有序数组中的运用找元素,编写猜数字游戏.

2024-05-09 18:11:05 260 1

空空如也

空空如也

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

TA关注的人

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