- 博客(34)
- 资源 (1)
- 收藏
- 关注
原创 对于共用体,内存对齐后,用数组操作多余分配的字节是否合法?
该共用体理论上在内存中只占5字节,但是经过内存对齐后,实际会占8字节,内存对齐后占8字节,当我越界访问数组a下标为6,7,8且越界赋值的时候,程序是否会报错或者死亡呢?union dy{ unsigned char a[5]; int b;}dy1;
2023-10-26 20:39:14
152
原创 二维数组的数组名和相关的运算
int a;//系统将分配一个1个int类型字节 &a是获取a的地址,并告知系统我占的字节数是int类型个字节数;a+1表示的是数值上的加1 假定a=5 那么a+1=6.int a[5];//系统将分配5个连续的int类型字节数,单个元素的类型为int;&a是获取整个数组a的地址,并告知系统我占的字节数是int[5]个字节数;a是数组的首元素地址,首元素(数组中每个元素类型一致,前文中提到该二维数组的单个元素类型为int) 类型为int型,
2023-10-11 20:35:16
390
原创 指针数组和数组指针
格式:数据类型 (标识符) [数组元素个数]示例://指针数组//指向数组的 数组指针下面通过用数组指针和二维数组来演示数组指针的使用;//定义一个3行5列的二维数组//定义一个数组指针(行指针)//arr数组名从特性上也类似于数组指针//打印一下p的值和arr的值printf("对p和arr进行加1操作:\n");//当他们的偏移量为1时,他时增加4个字节还是40个字节呢?//行指针每次移动1 偏移量= 首地址 + [数组元素个数]*数据类型;
2023-10-11 19:04:18
72
原创 char ch=-1 分别打印%d的值 和%u的值,值各为多少?
char ch=-1分别用%d和%u打印为多少unsigned char ch=-1 分别用%d 和%u 打印为多少?
2023-10-10 22:39:35
859
原创 自定义交换函数swap的误区
swap4()函数在内部非法操作没有初始化的指针。sawp2()函数在函数内部交换的x,y的地址,与外界x,y的地址和值无关;swap1()函数只在函数内部交换x,y的值,与外界x,y的值无关;swap3()函数在内部操作了外界 x,y 的值。
2023-10-10 21:02:30
63
原创 插入排序
插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。
2023-06-04 19:00:47
142
1
原创 选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
2023-06-04 18:37:51
149
原创 查找算法(折半查找)
此时low=0;high=10;第一轮查找,直接比较mid指针(下标为5)所指的元素(25) 和 待查找的元素35,发现 25<35,由此可知,待查找元素35应该在mid指针的右侧,即下图中红色区域内;我们已知low为左边界的标志,我们此时要查找的元素可能在红色区域内,而此时我们的low指针在红色区域之外,所以此时我们需要缩小查找范围,使得low指针在红色区域之内,我们将low指向mid+1,因为mid已经比较过了,不符合,所以可以直接将low=mid+1,然后进行第二轮查找;图片如下所示:
2023-06-04 16:35:50
1884
原创 查找和查找算法(顺序查找)
如果表中存在这样的一个数据元素,则称查找是成功的,否则查找是失败的。平均查找长度(ASL,Average Serach Length):所有查找过程中进行关键字比较次数的平均值,用于衡量查找算法的效率,包括成功和失败两种情况。查找24时,查找到23,发现23<24,指针向后移动,发现25>24,此时就不会向后寻找了,因为数组时有序的,后面的数都比25大;假设依旧是在下面有序表中,查找元素23,跳跃法,就是如果比较元素不一致,指针就向后跳动几个位置;
2023-05-31 19:15:08
914
原创 图的遍历
图,从不同的顶点出发得到的序列不一样,就算是从相同的顶点出发得到的序列也可能不一样,要看图的存储结构;如果是非连通图,调用一次BFS函数无法实现对图的遍历;如下图所示,分别用邻接矩阵和邻接表来存储该图;下图中,左侧为针对非连通图的伪代码;
2023-05-30 17:00:19
74
原创 图的基本操作
假设NextAdjVex(G,0,3):含义就是在图G中,查看顶点A相对于D的下一个邻接点,为-1;在邻接表中,在B和D的边链表中增加一个结点,可以将结点插在边链表头部,这样时间复杂度业务O(1);假设NextAdjVex(G,0,1):含义就是在图G中,查看顶点A相对于B的下一个邻接点,为C;在邻接矩阵中吗,扫描E行,找到第一个为1的值即可,如图所示,第一个邻接顶点为C,不存在返回-1;在邻接表中,在B和边链表中增加一个结点,可以将结点插在边链表头部,这样时间复杂度业务O(1);时间复杂度为O(1)
2023-05-29 22:20:03
1303
原创 图的定义和一些基本术语
图(Graph )是一种比线性表和树更复杂的数据结构。在线性表中,数据元素之间是 一对一 的关系,每个数据元素 只有一个直接前驱 和一个直接后继。在树形结构中,数据元素之间有明显的 层次关系,上一层的数据元素(结点)和下一层的元素(结点)是一对多的关系。而在图形结构中, 数据元素之间的关系是任意的, 是多对多的关系。
2023-05-28 15:59:59
194
原创 哈夫曼树
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
2023-05-28 11:07:08
73
原创 树、森林和二叉树
文章目录一、树1.树的存储结构:2、树的双亲表示法:3、树的孩子表示法二、树、森林和二叉树1、树的数据结构和二叉树的数据结构2、树和二叉树之间的转换3、树、森林的遍历1.树的遍历2 森林的遍历一、树1.树的存储结构:2、树的双亲表示法:3、树的孩子表示法二、树、森林和二叉树1、树的数据结构和二叉树的数据结构2、树和二叉树之间的转换3、树、森林的遍历1.树的遍历2 森林的遍历
2023-05-26 20:55:56
49
原创 二叉树的存储结构和二叉树的遍历方法以及实现代码
实现代码在上述代码段中,函数为 PostOrder1(BiTree TT)、InOrder1(BiTree TT)、PreOrder1(BiTree TT);如果二叉树如下图中所示,补全节点使其成为完全二叉树的方法太浪费空间;给定一个序列,在给定一个遍历的方法,能否将还原出二叉树呢?下图中的左右 要理解为树木,不要片面的理解成节点;答案是:不能,如下图,给定先序遍历 123。先看动图看遍历步骤,再看实例;先序遍历序列+中序遍历序列。后序遍历序列+中序遍历序列。层次遍历序列+中序遍历序列。
2023-05-25 20:35:57
2132
原创 树和二叉树
文章目录一、树和二叉树1、树的定义2、基本术语:3、树的性质二、 二叉树1.定义2.几种特殊二叉树3、二叉树的性质不考研的话,搞清楚树的概念和原理就行了;代码少一、树和二叉树1、树的定义2、基本术语:3、树的性质二、 二叉树1.定义2.几种特殊二叉树3、二叉树的性质
2023-05-25 13:13:17
59
原创 字符串的匹配算法(BF+KMP)
它的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。kmp算法的时间复杂度O(m+n)。
2023-05-24 23:03:57
596
原创 队列的链式存储实现
链式队列 : 用链表形式实现的队列。链表结点为队列数据存储区,链表结点包括两部分数据存储。指针存储区 :存放下一个链表结点的地址。数据存储区 :存放真实有效数据的区域。头指针执行头结点,尾指针指向尾结点。
2023-05-19 15:29:23
340
1
原创 队列的顺序存储实现
如上图,假设需要将元素1 到元素12 全部入队,当t元素1 到 元素10入队到队列中时,发现队列已经满了,此时元素1,2,3依次出队,头指针移动位置此时如果使用的是普通队列,想往队列中入队元素是无法入队的,因为队尾指针已经到了数组的最后一个位置;如果再入队,队尾指针加1,即图中下标为10的位置,明显不存在该位置,入队会发生错误;即使队头处有空位置,也无法入队元素,这种情况就是假溢出;所以普通队列的这种方法浪费了内存;所以下面我们使用循环队列来解决假溢出的问题;
2023-05-07 23:04:16
1109
原创 栈的顺序存储实现和链式存储实现
相比于单链表,栈的实现显得简单许多,所以只要大家掌握了单链表的代码,完成这章节内容应该相当容易;大家多复习复习单链吧。
2023-05-04 22:20:56
326
原创 链表常用考题
2.分别查询出两个链表的长度,La长度为9,Lb链表长度为6,然后将p1指针向后移动(9-6)个结点,p1所指结点为C, p1指针所指部分链表长度为6,p2此时所指链表长度也为6,相等;然后再让p1和p2一起向后移动,当p1移动到NULL时,p2正好在倒数第二个结点,大家可以自己对照表格比划一下;3.然后p1,p2开始向后一起移动,当p1==p2时,此时的地址即为汇聚结点;先让p1从头结点向后移动两个结点,p2不动,此时p1已经到了结点B,思路:假定链表La,Lb为两个汇聚的单链表;
2023-05-02 23:19:22
386
原创 链式存储与单链表(上)
按位序每个结点只含有一个指针域来存放其直接后继元素的地址;//自定义链表的数据元素为整数(也可以定义数据元素为结构体类型,根据实际需求定义,这里为了方便就定义整数类型)//存放结点的数据元素//指向下一个结点的指针//LNode 为结构体别名,LinkList为结构体类型指针的别名带头结点的单链表;
2023-04-30 21:07:09
81
1
原创 线性表的基本概念
采用顺序存储的方式实现的线性表简称为顺序表,把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
2023-04-16 14:52:51
140
1
原创 实现epoll机制对IO进行管理实现正向代理服务程序
客户端想要访问一个服务器,但是它可能访问这台服务器,这时候这可找一台可以访问目标服务器的另外一台服务器而这台服务器就被当做是代理人的角色 ,称之为代理服务器,于是客户端把请求发给代理服务器,由代理服务器获得目标服务器的数据并返回给客户端。客户端是清楚目标服务器的地址的,而目标服务器是不清楚来自客户端,它只知道来自哪个代理服务器,所以正向代理可以屏蔽或隐藏客户端的信息。正向代理服务器模型:。
2023-04-02 23:45:03
195
2
原创 recv 返回值大于0,但是缓冲区中无数据的问题
这段数据被recv后,poll应该阻塞(因为缓冲区中已经没有数据),直到收到"第一个这是第2个超级女生,编号002"才停止阻塞;没有数据poll没有阻塞,没有数据recv也没有退出,客户的接收的buffer输出为空,长度为0,但是recv返回值却为10>0,服务端运行结果: 出现clients(client=4)disconnect的原因是我在客户端使用了crtl+c终止了客户端。缓冲区如果没有数据可读,返回值应该小于0,错误代码除了errno==EAGAIN的情况,其余错误都应该退出;
2023-03-29 15:38:57
833
4
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人