- 博客(52)
- 收藏
- 关注
原创 2025_2_11 哈希表
以一个键值对结点指针数组为哈希表的基本结构,此数组的每一个存储单元都指向一个键值对结点链表。这种设计下哈希表的基本操作思路如下(大致):进行插入操作时,计算key的哈希值以确定存储的哈希桶位置,接下来:若哈希桶为空,则此结点成为哈希桶的第一个元素。若哈希桶不为空,则需要遍历哈希桶,如果“Key”已存在,则更新Value。若“Key”不存在,则再向哈希桶中添加一个元素。此时哈希桶中的多个元素,是以链表的形式挂起来的。进行查找操作时:同样先计算key的哈希值,然后在对应索引的链表中遍历查找这个键。
2025-02-11 22:52:40
519
原创 2025_2_9 C语言中队列
因为链表实现没有数组实现快,所以队列大多数是用数组实现的。它只能在一端添加元素,在另一端访问,删除元素。队列也是一种受限制的线性结构。
2025-02-09 21:53:34
230
原创 2025_2_7 C语言中栈和改变指针指向不传二级指针的方法
栈是一种受限制的数据结构,它只能在一端添加或者删除元素,符合的特性这个操作受限制是为了安全而考虑的,这样就能减少非法操作,并且适合生活中很多的场景stack.h1stack.cmain.c。
2025-02-07 22:10:33
367
原创 2025_2_3 C语言中关于枚举类型,动态内存分配
枚举类型是用来表示一些离散值的枚举常量默认从0开始,依次递增1以上:s1=0,s2 = 1, s3 = 2, s4 = 3枚举常量的调用有两种方法。
2025-02-03 22:20:26
384
原创 2025_2_2 C语言中字符串库函数,结构体,结构体内存对齐
最后一共占用15个字节,其中最大数据类型为int,占4个字节,所以最后的字节数应该是4的倍数,取最小是16.从地址28到下一个8字节对齐的地址是32(因为32是8的倍数),所以编译器会插入4个填充字节(地址28-31)。在char c和接下来的int n[5]之间,编译器可能会插入填充字节以确保n[0](即数组的第一个元素)的地址是4的倍数。比较是基于字符的 ASCII 值进行的,从第一个字符开始逐个比较,直到遇到不同的字符或字符串结束符(\0)为止。从一个4字节对齐的地址开始(在这里是地址8)。
2025-02-02 21:55:43
791
原创 2025_2_1 C语言中关于字符串
C语言中的字符串都是字符数组,以空字符 ‘\0’结尾。创建一个字符数组必须以空字符结尾,不然会访问非法区域,直到找到\0为止长度为n的字符串字面值,会存储在虚拟内存中的只读数据段中,分配n+1长度的字符数组,用来存储字符数组和一个空字符。字符串被视为字符数组,所以该字符数组的首元素地址就是字符串数组名即字符串名。而且是该指针是指向常量的指针,即不能通过该指针修改常量里面的值。字符数组可以改变其中的值,但字符串不能,字符串被看为是字符数组。
2025-02-01 22:49:31
459
原创 2025_1_31 C语言中关于数组和指针
因为这个指针在函数内被创建,一旦函数被销毁,这个指针就成为了。他是先返回当前解引用的值,然后自增,指向下一个元素的地址。*p++常被用于数组的遍历。,指向了被释放的内存区域。指针作为返回值一般是。
2025-01-31 22:22:58
439
原创 2025_1_27 C语言内存,递归,汉诺塔问题
内核虚拟内存 || 栈空间(Stack) || (高地址) || 堆空间(Heap) || (低地址) || 数据段(Data) || (包括BSS段) |
2025-01-27 21:15:47
844
原创 2025_1_26 c++中关于构造和析构的顺序
全局对象:在程序启动时构造,在程序结束时析构。最早和最晚自动对象:在作用域内按声明顺序构造,在作用域结束时按声明的逆 序析构。声明是顺序,析构时逆序静态对象:在第一次执行到该对象时构造,在程序结束时析构。执行到时构造,程序结束时析构,但析构的时间晚于全局对象。
2025-01-26 22:08:51
413
原创 2025-1-25 c++学习中关于static,初始化列表,友元函数和友元类的问题
在类中,不仅成员变量可以加static,成员函数也可以加static,成员函数加上static之后只能在函数中访问静态变量,在成员变量private的情况下加上static过后,改成员变量就变为全局的了,在主函数中不能直接访问或者修改,需要在public区写上获取静态成员变量的函数才能访问。加上static后该变量的生命周期就延长了,不会随栈帧的销毁而销毁。以下代码的作用是计算调用构造函数的次数return a;//这儿形式参数用引用就不用访问拷贝构造,返回值用引用也不用访问拷贝构造。
2025-01-25 17:46:47
332
原创 2025.1.23 C++学习中实例化对象作为参数或返回值的情况
为什么在函数内部定义的对象不能引用返回,因为当函数被销毁的时候,对象也被销毁了,那么return一个引用就是被销毁的对象的别名,会导致错误,所以要分清楚返回对象的生命周期。
2025-01-23 21:02:13
283
原创 2025.1.22 关于c++学习中拷贝构造的问题
在各种构造函数中,比如带参数的和不带参数的构造函数,全缺省的构造函数,最特别的就是拷贝构造函数,
2025-01-22 22:30:33
335
原创 为什么不带头节点的非循环单链表进行插入需要使用二级指针,而带头结点的循环双链表不需要二级指针
那么为什么不带头节点的非循环单链表进行插入需要使用二级指针,而带头结点的循环双链表不需要二级指针呢,原因就是不带头节点的非循环单链表进行插入需要改变实参的地址,而带头结点的循环双链表不需要改变实参的地址以头插为例。
2024-09-05 17:18:11
452
原创 关于C语言中实参与形参和指针与二级指针的理解
在如下代码中,我的test函数要将结构体指针作为实参传递给function函数插入值,那么为什么必须传递二级指针才能正确进行插入呢。
2024-09-04 21:29:26
558
原创 将一个结构体的地址传入给一个函数,这个函数将此结构体的地址传给另一个函数,为什么跑不起来,原因尽然是……
跳过testInitList()函数,直接在test_pushback()函数中调用初始化函数完成初始化,SQLinitList(sl);//无敌之精华,写入csdn。这儿的test函数之间的。
2024-09-03 13:19:01
511
原创 时间复杂度
所谓时间复杂度就是看循环持续的次数注意这个次数不是代码的执行次数,而是循环整体的执行次数,一般是循环体的最主要语句的执行次数1.每次迭代后,搜索区间减半:这是二分查找算法的关键特性。每次迭代后,要么在左半部分继续搜索,要么在右半部分继续搜索,但无论哪种情况,搜索区间的大小都减少了一半。2.迭代次数与数组长度成对数关系:由于每次迭代后搜索区间减半,因此经过k次迭代后,搜索区间的长度将变为原来的(1/2)^k。当搜索区间长度变为1时(即high - low + 1 = 1),算法停止。
2024-09-01 18:44:22
330
原创 顺序表删除元素快速方法
假如说3在顺序表中只有一个,解题方法可以是让3后面的元素依次向前移动,时间复杂度为O(n)。如果3在线性表中有多个,那么就需要碰到一个3就将3后面的元素移动到前面去,知道3被删除完,这个的时间复杂度为O(n^2).当L->data[i]!= num的时候k就加一,当等于的时候就不动。这样就可以保证当k遇到第一个空白位时,以后的每一个k都指向需要填充的位置。所以我们需要一个简单的方法来让顺序表快速删除元素。eg:删除顺序表中元素为3的元素。
2024-04-01 18:18:52
454
1
原创 C语言:动态内存管理
这个代码中的元素个数由键盘输入,并将其作为元素个数,这在数组中是做不到的(C99之前),所以提供了很大的便捷性,不用再为数组分配一块巨大的空间防止其越界,这样节省了空间的开销。针对情况2:当原有空间没有足够的空间的时候,会开辟一块足够大的新的空间用以存储新的数据,并将旧的数据复制到新空间中,还会释放旧空间,同时返回新的空间的地址。使用realloc函数分配的额外空间是不初始化为0的,所以打印出来的后四位需要自己赋值,不然的话是随机值。malloc函数用以创建一片动态的空间,空间大小由我们自己决定。
2024-03-15 20:00:09
1033
原创 C语言:内存函数
注意count时字节数,因为memcpy函数的第三个参数是需要复制的字节数,因为int类型的字节数时4个字节,所以需要复制5个元素的话就需要20个字节。memmove和memcpy都是起到的复制的作用,不同点是memmove函数可以处理的原内存块和目标内存的块是可以重叠的。如果要处理的原空间和目标空间出现重叠,那么必须使用memmove函数进行处理。
2024-03-07 19:07:37
713
原创 C语言题目:指针
答案:>解析:i作为全局变量且在未赋值的情况下初始值为1,而且是有符号整数,当i–后变为-1sizeof的返回值是无符号整数,也就是说将i于sizeod的返回值做比较会发生自动类型转换(整型提升),将-1的有符号整数转化为无符号整数,就是将-1的二进制补码11111111111111111111111111111111与它作比较,那么会输出>.
2024-03-01 07:30:00
315
1
原创 C语言:指针(二)
qsort函数需要4个参数,第一个参数是数组首元素的地址,第二个参数是数组中元素的个数,第三个参数是数组中数据类型的大小,第四个参数是一个函数,作用是实现排序这种数据的方法。在main函数中,将test2的地址传递给test1,然后test1用函数指针变量来接收,然后调用test2函数,那么test2函数就是回调函数。函数指针是用来存放函数的地址的,那么有很多函数,要将它们的地址存放在一起,那么就可以使用函数指针数组。指针变量也是变量,是变量就有地址,所以二级指针是用来存放一级指针变量的地址的。
2024-02-29 15:55:44
2353
原创 C语言:数组的地址和数组首元素的地址的区别
当我们谈论数组的地址时,我们通常指的是整个数组的起始地址,也就是数组第一个元素的地址。例如,如果你有一个指向10个整数的数组的指针int (*p)[10],*p将得到一个包含10个整数的数组。数组的地址:它是指向整个数组的指针,其类型是数组类型(例如,int (*p)[10]表示一个指向含有10个整数的数组的指针)。当你解引用数组首元素的地址时,你会得到数组的第一个元素。数组首元素的地址:它是指向数组第一个元素的指针,其类型是该元素的类型(例如,int *p表示一个指向整数的指针)。
2024-02-23 11:12:53
1197
2
原创 C语言:指针(一)
在内存中将其划分为一个一个的内存单元,每个内存单元的大小取一个字节(8个bite),每个内存单元也有一个编号,就相当于门牌号一样,这样CPU就可以快速访问内存中需要的数据了。在32位计算机中有32根地址总线(相关知识可以自行学习),每根地址总线都可以使用电信号来表示0和1,这样就由32根地址总线产生的二进制序列就可以当作地址,那么一个地址就是32个bite位,需要4个字节来存储。pa是指针变量,int*是指针变量的类型, *表示pa是指针变量,int表示pa指向的类型是int类型。的效果和a = 0;
2024-02-21 18:46:52
2771
3
原创 C语言:操作符详解
八进制中的每个数字都是由0~7组成的,所以至多需要3个二进制位就可以存放一个八进制的一位数(因为7 的二进制数位111),所以直接从右向左依次取3个二进制位转化为一个十进制数字就可以形成八进制数,如果到左边位数不够直接换算就行。第一位1溢出,即为00000000 00000000 00000000 00000000,由于符号位为0是正数,不要转换为原码,则结果就是0.各种运算符的优先级都有所不同。1 的补码就是原码:00000000 00000000 00000000 00000001。
2024-02-19 20:10:09
1299
1
原创 C语言题目:一些简单的编程和递归题目
1.喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)。“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1。求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,写一个递归函数,输入一个非负整数,返回组成它的数字之和。例如,调用函数,则应该返回1+7+2+9,它的和是19。例如:2+22+222+2222+22222。编写一个函数实现n的k次方,使用递归实现。3+3^3,则153是一个“水仙花数”。
2024-02-18 14:00:38
490
1
原创 C语言函数(四):递归
在学习函数这一章节,递归是每个计算机语言绕不开的知识点,那什么是递归呢?递归就是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。main();return 0;上述代码就是一个简单的递归程序,只不过它只是演示了递归的基本作用,不是为了解决问题,这不是一个正确的递归程序,代码最终会陷入死循环,导致栈溢出。把一个大型的复杂的问题层层转化为一个与原问题相似,但规模较小的子问题来求解,直到子问题不能再被拆分,递归就结束了。所以递归的思考方式就是将大事化小的过程。递归中的递就是递推的意思,
2024-02-15 11:37:46
1097
1
原创 C语言函数(三):数组和函数实现扫雷游戏
这个函数用以打印棋盘,可以看出棋盘的规划是否正确,当然我们只用打印show棋盘,不用打印mine棋盘,因为mine棋盘可以看到的全是0,这里为了不多写一个函数用来分别打印’*‘和’0’,所有我们再传一个一个参数type,告诉Printboard函数应该打印什么字符。使用FindMine函数排查雷,先输入要查看的坐标,如果坐标符合规定,则看这个坐标是否是雷,如果不是则计算周围8个位置的和并输出在棋盘上,当排查完71个没有雷的位置后,游戏成功。9的棋盘上布置雷的信息和排查雷,首先想到的是创建一个9。
2024-02-10 12:04:14
1182
1
原创 C语言函数(二):详解static和extern
指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。1.局部变量的生命周期是:进入作用域创建,生命周期开始,出作用域生命周期结束2.全局变量的生命周期:整个项目的声明周期。
2024-02-08 11:54:39
983
原创 C语言函数(一):基础知识
自定义函数非常重要,它的书写给程序员写代码提供了更多的创造性一般在使用函数的时候,直接将函数写出来就可以使用了,像上面的代码,直接将自定义函数放在主函数的上面就可以了,但是如果我们将自定义函数放在主函数的下面,程序就会弹出警告。int x = 10;int y = 23;printf("实参x为:%p 实参y为:%p\n", &x, &y);//输出33return 0;printf("形参x为:%p 形参y为:%p\n", &x, &y);但如果直接运行代码也不会报错,依然能够执行。
2024-02-07 20:34:47
1366
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅