自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [两个栈实现队列]

/思路:两个栈实现队列,栈是先入后出,队列是队尾入,对头出,(先入先出),那么可以这样干,假设一个栈Pushst,先入1,2,3,4,那么成队列,先要出1,1在一个栈中是不可能出的,那么可以把Pushst的数据出栈放到另一个Popst中,顺序就转过来了,在Popst中出栈,就顺序合适了!队列Pop:在另一个栈中Popst,如果Popst中没有数据,那么把Pushst中的数据全部放到Popst中即可,在Popst中出数据就可以了!综上所述:队列Push:在一个栈中Pushst中如数据就可以了!

2024-03-06 00:00:45 260

原创 预处理大致解析(参见《C语言深度解剖》更好得到学习)

1.C语言设置了一些预定义符号,可以直接使用,这些符号在预处理阶段会被处理!__ FILE __ //进行编译的源文件__ LINE __ //文件当前的行号__ DATE __ //文件被编译的日期__ TIME __ //文件编译的时间__ STDC __ //如果编译器遵循ANSI C,其值为1,否则未定义!//测试 - - -return 0;

2024-03-03 12:16:00 969

原创 数据结构:队列 || oj(l两个队列实现栈)

[TOC](数据结构:队列 || oj(l两个队列实现栈))

2024-02-29 23:56:57 853

原创 编译与链接

并且包含的头⽂件都被插⼊到.i⽂件中。//翻译环境是由编译和链接两大过程组成,编译阶段也是非常复杂的,它分为(预编译、编译、汇编)三个过程,这三个过程是复杂的,也是非常重要的!编译过程就是将预处理后的test.i文件进行一系列的:词法分析,语法分析,语义分析及优化,生成相应的汇编代码文件!//各个.h,.c文件通过预处理生成.i文件,再把.i文件通过编译编译生成的.s文件,在通过汇编生成.o文件!//• 注:在Windows环境下的⽬标⽂件的后缀是 .obj ,Linux环境下⽬标⽂件的后缀是 .o。

2024-02-28 14:19:28 847

原创 链表和顺序表的优劣分析及其时间、空间复杂度分析

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是。

2024-02-23 21:46:56 2376

原创 栈的实现及其括号匹配问题

/2.拿到右括号‘)’,‘]’,‘}’,拿到右括号,把入栈的左括号出栈,看是否匹配,如果匹配,则继续执行上面操作,如果不匹配,则返回false。//4.左括号比右括号多的问题,遇到左括号入栈,遇到右括号出栈,则一定左括号的元素没有出完,检测栈是否为空,不为空,返回false。//5.右括号比左括号多的问题,在拿到右括号出栈之前检测栈是否为空,如果为空,则右括号多,返回false!//3.考虑如果左括号和右括号的数量一样多,则入栈,出栈,最后的栈内元素个数为0,栈为空!//获取栈的元素个数。

2024-02-21 12:31:02 792

原创 单向不带头链表

我的理解是链表是一种逻辑上是线性结构,在真正的内存空间中是非线性,一般而言,不连续的结构,它是通过在堆区一块一块申请空间,用指针把各块空间连起来的结构,也就保存各块空间的地址来连接!//要考虑头删怎么写,要删除头,把下一个节点存起来,当做newHead,即使下一个节点是NULL,也可以存起来,所以只有一种情况!//2.保存pos后面的后面节点(NULL没有影响),删除pos之后的节点,在链接保存的节点。//或先把节点插在pos之后节点的前面,在把pos里面存新节点。//删除pos后面的一个节点。

2024-02-20 15:48:03 641

原创 简单贪吃蛇模拟(C语言版本·)

GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;首先,对于现在的我来说,写这样一个贪吃蛇还是很难的,写这个东西,让我感觉最深刻的是枚举类型的运用,这是一个好东西,还有结构体的运用,能够学到大概一个简答的东西,怎么组织,怎么来写,这是很重要的一点,看整个代码,不是很难,但是如果你自己要组织出来,要写出来还是很难得,特别是枚举的应用!

2024-02-19 20:22:36 1995

原创 联合体与枚举

联合体也是由一个或多个成员构成的数据类型,它最大的特点是只为最大的一个成员开辟空间,其他成员共用这个空间,这个东西也叫共用体!联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。第二个联合体的最大一个占14个字节,不是4个倍数,因此浪费2个字节,成16个字节,成为4的倍数!解析:第一个联合体最大的一个占5个字节,它不是4的倍数,因此成8个字节,浪费三个字节!*当最大成员大小不是最大对齐数整数倍的时候时,要对齐到最大对齐数的整数倍!

2024-02-14 12:39:07 349

原创 结构体,位段问题

第一个char为1个字节,struct S3 s3为16个字节,里面的最大对齐数为8个字节,所以总共是8+16 = 24个字节,最后一个double 是8个字节,正好对齐,来放double ,总共24+8 = 32个字节!解析:(1)第一个char直接放,第二个int对齐数为4,所以前面为4个字节,后面放了4个字节,共8个字节,还有一个char没放,放完之后9个字节,结构体的总大小为最大对齐数的整数倍,最大对齐数为4,所以是12个字节。内存中每个字节分配⼀个地址,⼀个字节内部的bit位是没有地址的。

2024-02-13 22:09:26 726

原创 数据在内存中的存储

bit 位,但是在C语⾔中除了8 bit 的 char 之外,还有16 bit 的 short 型,32 bit 的 long 型(要看具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M.对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M.*2^129表示无穷大!

2024-01-28 12:37:57 1365

原创 环形链表的约瑟夫问题

这个题的思路呢,就是建立一个环形链表,从1计数,计数到m就删除节点,然后返回最后的节点存的值,有个问题是,循环的结束条件是什么?这是一个难点,下面画图解决!cur->next == cur时,循环结束。

2024-01-25 20:48:40 247

原创 [反转链表] [合并两个有序链表][分割链表]

思路2:把指针翻转,把指针反转的意思是,把存节点的地址交换,定义三个指针n1,n2,n3,n1 = NULL,n2 = head,n3 = head->next,n2为第一个节点翻转,n2->next = n1,n2里面原来存的地址找不到,因此要n3存下一个节点的地址,这样这个题就可以反转了!这个题建立一个新链表,取小的数尾插即可,这儿有一些技巧,可以建立一个头结点,直接尾插,这样就省去了考虑newHead为NULL的情况,这个方法,在一些题中有妙用!下面是一个正常的做法!

2024-01-23 23:00:45 374

原创 移除链表元素和链表的中间结点

思路1:很简单,最常规的方法,建立一个新的链表,头为newHead,遍历链表,不是val值的拿下来尾插,注意一些细节,比如,你拿一个节点的时候,你拿的这个节点里面存的是下一个节点的地址,可能在最后一个节点,后面还跟了其它节点,只要把最后一个节点里面的next置NULL就行,在就是特殊情况特殊处理,就能做好这个题。思路2:遍历一遍链表把val在原链表中删除,这个思路说起来简单,做起来难!

2024-01-21 22:41:42 350

原创 移除元素和合并两个有序数组

合并两个有序数组,从小到大排列,nums1 = [1,2,3,0,0,0]和nums2[2,5,6],定义三个指针了l1,l2,l2,l1指向nums1,l2指向nums2,l3指向要放的地方,如果从前向后比较,则比较的元素的覆盖了,因此必须从后向前比较,比较大的元素向后放,如果nums2先放完,则已经完成,如果nums1先放完,则把nums2没有放的元素放进nums1中,思路就是这样!

2024-01-20 15:13:31 364

原创 【动态内存开辟】

首先这儿介绍一本很好很好的书《c指针编程之道》根据这本书中的内容来学习这几个函数!!!1.下面介绍第一个函数malloc,原型:void* malloc(unsigned int num_bytes),此函数在堆区可以占用一块空间,返回的是占用空间的第一个地址,可能开辟失败,一定判断是否开辟成功!开辟失败,返回NULL,对开辟成功的内存不做处理,也就是以前的随机值!• 如果开辟成功,则返回⼀个指向开辟好空间的指针。• 如果开辟失败,则返回⼀个 NULL 指针,因此malloc的返回值⼀定要做检查。

2024-01-18 16:34:53 374

原创 动态顺序表

存的数据个数是多少,那么,有一个结构体,定义一个指针,以这个指针指向来开辟空间,然后在开辟的这个空间内放数据,在记录有效数据,看看是否空间满足,后面就根据自己的需求写代码!线性表就是在逻辑上是按一条线的形式存储,而在物理空间或者真正的内存中可能不是线性的,这个,有些因素不可控,比如:数组就是在逻辑和物理空间上都是线性的,而顺序表是malloc的堆区的空间,是不知道空间是连续的还是怎样的!2.先给出静态顺序表的结构!这个简单理解,数据结构就是存储数据的结构,数据用怎样形式来存储,就考虑实现怎样的结构!

2024-01-17 21:07:44 401

原创 文件操作一(非常重要)

1.程序分为数据文件和程序文件。2.程序文件:包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)3.数据文件:存储数据的文件。

2024-01-16 22:47:39 955 1

原创 函数栈桢的创建和销毁

看汇编代码,首先是把__tmainCRTStartup这个函数的栈底的地址压栈,存入栈区,为的是在函数返回过来,能够找到这个地方,然后是esp和ebp指向同一块区域,esp-0e4h,esp向上指,开辟了288个字节的空间给main函数的栈桢,之后ebx,esi,edi入栈,下来在main函数开辟的栈区,初始化了一部分空间,我上面的例子初始化了36个字节(填充为0xcc),然后给a,b,c三个变量开辟了空间,这个以8个字节为一部分向上开辟,这部分完了之后,就要对Add函数进行操作,

2024-01-14 15:07:12 917

原创 关于数组和指针的面试题(难)

测试环境:X86 VS2022 debug环境。

2023-11-27 16:56:52 71

原创 指针操作一维数组和二维数组的理解!

你虽然觉得指针操作一维数组很简单,但是通过做题发现并没有那么简单,特别是二维数组!

2023-11-23 15:59:53 71

原创 【qsort学习及改造冒泡排序能排序任何数】

下面模拟的通用的冒泡排序!这个函数也不是很复杂!

2023-11-21 16:05:55 124

原创 【深入指针理解3】

"hello world "这个字符串是怎么存储的,其实是这样的,pstr是指针变量,里面存的是地址,从这个地址开始在字符常量区存放"hello world ",由于在字符常量区的字符串是不可变的,所以在存储同样的字符串时,只会存储一份。很简单,str1和str2是两个字符数组,在栈区会开辟两块不同的空间,str3和str4是指针,“Hello world”这个字符串会在字符常量区开辟,指针只要指向这块空间就可以!上面的代码表明函数的名字这个变量里面存的就是函数的地址,&函数名打印出来的也是函数的地址?

2023-11-21 12:05:25 46

原创 【冒泡排序设计】

对于一排数字:5,4,3,1,2,8,7这7个数字两两相邻进行比较,先进行一趟冒泡比较!没进行一趟冒泡比较一定能确定一个元素的位置,那么,有n个元素,则进行n-1趟排序就可以确定没有元素的位置,而n个元素,交换n-1对,能确定1个元素的位置。它的核心思想是:两两相邻的元素进行比较,如果符合要求,则不交换,不符合要求,则两个元素交换!它是在一块连续的内存中进行比较,它的效率相对较高。冒泡排序这个算法,对于我这样的初学者来说,也不是很简单!(没有想象的那么简单)!

2023-11-19 15:16:03 293

原创 深入理解指针2

sizeof(数组名)里面就是数组的名字,既然是数组的名字,那么就算的是整个数组的大小!通过上面代码可以看出arr和arr+1的差是4个字节,证明了arr就是首元素的地址,并且把首元素的地址打印出来和arr大的一样,进一步证明了arr是首元素的地址。这个数组名在不同的情况下有不同的含义,至于为什么一个数组的名字为什么有不同含义,是怎么实现的,我不会,感觉这样搞得东西让人有一点难受!• &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)

2023-11-19 14:34:28 35 1

原创 【传值调用和传址调用】

传值调用:传值调用的本质是把实参复制一份,放到形参开辟的一块空间中,本质是两块空间,形参的空间和实参的空间没有任何关系。如果不该变实参的内容,则用传值调用。传地址调用:传地址调用的本质是形参也开辟了一块空间,在形参开辟的空间中,里面存的是实参的地址,那么可以通过地址,找到实参真正的空间,进行操作改变实参的内容。完结!!!

2023-11-19 12:30:58 35

原创 野指针问题

野指针就是指针指向的位置是不可知的.(野指针也就是非法访问空间问题,你自己不能够控制自己访问的内存单元,甚至一个指针随意访问一个自己无法控制地址的单元!!!

2023-11-18 23:08:06 49

原创 指针理解(1)

1.在这儿我想从硬件的角度来解释地址是什么?看上图,在计算机中,CPU(一块芯片)与内存(一块或几块芯片)是通过导线来连接的,在者之间,有三组总线,数组总选,负责数据的运输,控制总线,负责读数据写数组,那么在这儿呢,我们要关心的就是地址总线,它是为了管理内存单元,编址所用的总线,一个内存单元有8位,是8根数据线所连接的,如果要访问一个内存单元,则必须要有对应的地址,通过地址,来找到内存单元,对所指定的内存进行操作,那么地址总线的多少则决定了地址编码范围有多大,决定了内存空间有多大!

2023-11-12 16:31:24 58 2

原创 【操作符优先级及整型提升问题】

这个反汇编也非常简单,首先i的地址就是ebp-8,把1放到了ebp-8所指向的单元(也就是把i存在了内存中了),接下来把i的值放到eax寄存器中,在通过add加1,放到eax中,在把eax的值放到i中,完成了一次(i++),在通过ecx和edx寄存器完成两次(i++),之后把i的值赋给eax,通过两次add计算出结果赋给ret!这个整型提升是非常重要的,也就是说CPU中的ALU在进行整形运算的时候,必须至少是4个字节,如果少于4个字节,那么要整型提升,补充空位。这个在单片机,Dsp中非常常见!

2023-11-11 20:36:24 54

原创 关于二进制位操作的一些面试题

不能创建临时变量,实现两个数的交换。求一个整数存储在内存中的二进制中1的个数。

2023-11-10 21:43:13 98 2

原创 一些重要的操作符详解

如果你是一个初学C语言的人,你可能感觉这些操作符不重要,但是我告诉你,这些非常非常重要,可能刚开始你感觉不到,但是到后面你写的多了,就会感觉到这些问题都是你把操作符没理解好导致的问题!原因:使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。位操作符有:&(按位与) 、|(按位或)、 ^(按位异或)、 ~(按位取反)这四种操作符(同样操作的是二进制)*整数的二进制表示有三种方法:原码,反码,补码。

2023-11-08 21:13:51 46 1

原创 【“单身狗”问题】

这个题看着简单,其实不简单,昨晚写这个题的时候,是不是第一影响是有序序列去重,但是这个题跟那个题完全不同,我也想到了那个双指针写法,想着不用排序能不能搞出来这个题,还是很难弄的。(任何数与0异或是任何数!你想一下,如果先排序,在用双指针来做这个题,是不是代价太大了,一般而言,这种题的要求就是只要遍历一遍,就要找出那个数.”,是不是只有一个数单一出现的,其它的数都是成对出现的,那么通过异或操作相同的为0,不相同的只剩下那儿“采用异或的办法来解决这个问题的,异或是(相同为0,相异为1)”,下面进行代码实现!

2023-11-08 13:46:16 77 2

原创 递归理解(1)

递归这个东西呢?我搞了很长时间,始终无法掌握,我知道它的执行流程,但是写一个递归,到底怎么想,我是始终掌握的不完整,递归这个东西,太重要了,如果理解好了,那么,二叉树就跟闹着玩一样!!!我将通过几篇博客,来慢慢理解递归的思想!!!下面将通过一个经典较简单的例子来分享递归,记住简单的例子弄懂了,那么难得也一样,包括二叉树,这个在递归中体现的淋漓尽致!

2023-11-04 14:10:59 55 1

原创 一道面试题,数组越界,陷入死循环问题

在x86,vs2022、Debug环境下测试下面代码,会有什么结果?由内存分布情况可知,i的空间和arr[12]的空间是同一块空间!注:如果不限定环境,在不用的环境下测试的效果会不一样;下面进行调试这个程序。

2023-11-04 00:19:27 71 3

原创 简单扫雷游戏的实现

4.排雷,查找坐标如果二维数据里面放的是‘1’,那么就是雷,游戏结束,如果存储的是‘0’,那么就不是雷,显示周围有几个雷,这儿考虑二维数组越界问题,问题就是边缘的周围雷怎么统计,给出的解决方案是外面扩大一圈,比如:雷盘是99,则申请空间的时候,申请11。6.实现功能:如果不是雷,周围也没有雷,则展开一片,这个看个简单,要写完整,不好写,我只实现了大概,Bug连连,难点就是两块区域重复问题怎么解决,还没想好.调试来解决程序的问题是最好的,可以加深代码的理解,慢慢来,不要着急!慢慢积累,相信自己会变得更强!

2023-11-02 19:37:55 73 2

原创 打印图形“X“问题

看我写出的坐标,很容易发现规律(1,1),(2,2);(3,3),(4,4),(5,5)是不是 x = y;(1,5),(2,4),(3,3),(4,2),(5,1)是不是x+y = n+1,n = 5;这样就很容易写出来了!这个题,刚开始做的时候也想了很多,想着先把前半部分打印,再把后半部分打印,其实没必要,这种题最重要的就是把打印图形的规律找出来,那么整个就能找出来了。先看看打印的这个图形!##那么怎样找出图形规律呢,很简单,你把打印的 ‘ * ’的每一个坐标写出来,就找到规律了!

2023-10-29 12:58:39 74 2

原创 有序序列合并

假设两个有序数组分别是arr1,arr2,做法是定义两个指针dst1,dst2分别指向arr1和arr2,如果dst1指向的数据小,则输出,指针向后指向,如果dst2指向的数据小,则输出,指针向后指向,如果一个数组的数字被全部输出了,另一个数组里面还有数字,那么直接遍历另一个即可,因为它本身就是有序的!今天一个同学给我上了一课:有些不会的问题一定要与优秀的同学请教,即使是你会的问题,但不是很熟悉,你一定要向优秀的同学请教,一定要脸皮厚一点,人家的思路和你的思路碰撞,会让你有很大的收获!

2023-10-29 10:43:27 118 2

原创 二分查找算法

二分查找的思想就是:对一个有序数组,查找的数字和数组中间数字作比较,每比较一次截取一半数字的过程,直至锁定查找的数字,如果锁定的空间为0,那么直接找不到数字!图上可以看出,如果arr[mid]>k,right = mid-1;如果arr[mid]<k;如此重复,就可以找到!*在一个升序的数组中查找指定的数字n.怎么求解,其实很简单,遍历数组找到即可。但是这种做法效率低,下面介绍二分查找的思想.查找有序数组arr[10] = {1,2,3,4,5,6,7,8,9,10}中,是否有k = 7这个数!

2023-10-26 13:36:06 80 2

原创 编写程序:多个字符从两端移动,向中间汇聚

有两个字符串:str1[] = “#############”;要达到下面这中效果!*定义两个下标left,right,指向str1的左边和右边,然后同位置和str2交换,在两边移动即可!只要是复杂一点的逻辑,画图解决是最好的!*怎么达到这种效果呢?*先看看是怎么回事?

2023-10-26 11:54:33 60 1

原创 随机数生成问题&&猜数字游戏实现

time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。*rand函数返回一个伪随机数,这个随机数的范围是0-RAND_MAX之间,RAND_MAX的大小是依赖编译器实现的,但是大部分是32767.头文件是:stdlib.h。*time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去.

2023-10-25 00:24:17 91 1

空空如也

空空如也

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

TA关注的人

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