- 博客(53)
- 收藏
- 关注
原创 原始套接字实现ping(三)—— 回显应答(ICMP接收实现ping)
上篇文章我们只实现了第一步:回显请求,也就是下面的第一行。其实测量延迟也包含在接收应答之中,这篇文章我们来实现回显应答,并完成完整的ping程序
2025-02-07 16:08:20
995
原创 原始套接字实现ping(二)—— 回显请求(ICMP报文发送)
上篇文章我们介绍了原始套接字和ICMP报文的组成和ping程序的原理,从这篇文章开始,我们进行代码的编写,实现回显请求。
2025-02-07 15:58:09
776
原创 原始套接字实现ping(一) —— 原始套接字和ICMP介绍
原始套接字是一种能够直接发送和接收 IP 数据包的套接字类型。这种套接字允许访问网络层或更低层次的数据,允许自定义 IP 数据包内容。原始套接字可以自定义套接字的内容,我们需要把原始套接字的内容变为和ICMP报文格式一样的套接字,发送给目的主机IP,来实现ping程序一样的效果。
2025-02-07 15:46:31
795
原创 TCP网络编程(三)—— 客户端的编写/服务器端和客户端的通信
上篇文章我们学习了TCP的服务器端模式的编写,这篇文章我们将开始编写客户端的代码,完成服务器端和客户端的通信。完整代码和演示在文章的后面。
2025-01-01 00:00:00
577
原创 TCP网络编程(二)—— 服务器端的编写
上篇文章我们学习了TCP的两种编程模式,这篇文章我们将开始编写服务器端的代码,讲解代码的原理。完整代码在文章的最后。
2024-12-29 13:27:08
993
原创 TCP网络编程(一)—— 服务器端模式和客户端模式
这篇文章将会编写基本的服务器网络程序,主要讲解服务器端和客户端代码的原理,后续文章将会学习编写服务器端和客户端的代码,实现服务器端和客户端的通信。
2024-12-29 13:19:16
1318
原创 信号用wire类型还是reg类型定义
总的来说,在模块内部,需要进行什么样的操作,就定义什么类型的信号(wire/reg),在模块外部,定于input端口就使用wire类型,定义ouput端口,原理类似于模块内部,根据信号的操作定义wire或者reg信号。
2024-10-05 13:38:00
945
原创 编写ROS2中第一个Helloworld节点
本篇文章是介绍如何编写一个完整的helloworld节点。ros2 pkg create表示创建一个包, --build-type ament_python表示语言是python,当然也可以是C++,ament_python替换为ament_camke,helloworld是包的名字。
2024-09-09 23:11:39
1010
2
原创 希尔排序——C语言
希尔排序是插入排序的一种更高效的改进版本。希尔排序通过比较相距一定间隔的元素来进行排序,随着算法的进行,这个间隔逐渐减少,直到最后变为1,此时的排序其实就是一次插入排序。
2024-07-13 12:44:30
349
原创 插入排序——C语言
1.对于第一个数来说,一个数无法考虑顺序问题,所以要从第二个数开始进行插入,进行排序。2.排序的思想是:从头开始遍历,如果该数小于一个数,那么该数就插入到较大数的前面。
2024-07-07 22:50:34
493
1
原创 哈希表——C语言
哈希表的核心是哈希函数,哈希函数是一个将输入数据(通常称为“键”或“key”)转换为固定长度的整数的函数。这个整数通常用作哈希表(Hash Table)中的索引,用于快速查找数据。本质上就是根据输入的值确定值的位置。
2024-07-07 22:49:23
521
原创 关键路径——C语言(理论)
关键路径,是项目网络中从起始事件到终止事件的最长路径,决定了项目的最短完成时间。关键路径中的任务没有任何可调整的余地,如果任何一个任务被延迟,整个项目的完成时间也会被延迟。
2024-06-28 00:02:18
1030
原创 关键路径——C语言(代码)
然后我们要来计算事件的最早开始和最晚开始时间,首先要遍历每两个事件之间的活动,得到活动的最大值(计算最早开始时间,因为要考虑事件前驱的所有活动都完成):
2024-06-28 00:01:03
963
原创 拓扑排序——C语言
1.计算每个顶点的入度,2.如果入度为 0 ,记录该顶点,输出。3.拿到入度为 0 的顶点,并且把该顶点的边都删除掉。4.重新计算入度,重复第2步,第3步操作。
2024-06-23 21:23:33
755
原创 迪杰斯特拉算法——C语言
第一步,先寻找距离最小的顶点,这也是我们找到的第一个顶点,也就是顶点1,因为其他顶点距离一定大于12(未连接的顶点一定大于12,因为需要中转)。第二步,把最近顶点作为中转点(顶点1)标记已访问,遍历其他未访问顶点,更新到顶点0 的距离(将顶点1作为中转点更新距离)。第三步,重复第一步和第二步。
2024-06-11 21:55:16
556
原创 克鲁斯卡尔算法最小生成树--C语言
同样是最小生成树,普利姆算法是从一个起始顶点开始,逐步扩展生成树,每次选择连接生成树和未包含顶点的最小边。而克鲁斯卡尔算法是按权值排序的方式,从最小的边开始逐步添加到生成树中,确保不会形成环,直到生成树包含所有顶点。
2024-06-09 13:28:36
704
原创 普利姆算法最小生成树--C语言
所谓普利姆算法,就是随便取一个点,然后根据已知边的权值大小,去寻找下一个顶点的过程。例如取 0 为起始的最小树。对于 0 来说,权值最小的边是 1,所以我们把顶点 2 也纳入到最小树,在这些已知边中,4 为权值最小的边(以访问的顶点不再访问),所以把顶点 5 纳入到最小树中。
2024-06-09 13:28:11
1028
原创 图的创建和BFS,DFS遍历
图是一种用于表示对象及其关系的抽象数据结构,由节点(也称为顶点)和连接节点的边组成。图可以分为有向图(Directed Graph)和无向图(Undirected Graph),以及加权图(Weighted Graph)和非加权图(Unweighted Graph)。
2024-06-07 18:09:36
881
原创 二维数组传参时不用二级指针接收
先放结论,二维数组数组名指向的类型是 int [x] 类型,int** 指针指向类型是 int* ,如果用二级指针接收会导致访问错误,因为 int [x] 类型和 int* 类型不同。
2024-05-31 22:49:20
1128
原创 平衡二叉树的构建(完整代码)
平衡二叉树就是二叉排序树的一种特殊情况,也就是说我们只需要在构建二叉排序树之后判断是否要执行:RR RL LL LR 操作就可以了。
2024-05-29 23:09:00
840
原创 平衡二叉树的构建(理论,部分函数代码)
平衡二叉树是二叉排序树的一种特殊情况,平衡二叉树(AVL)的特点是:每个节点的左右子树的高度差最多为 1 。那么如何实现左右子树的高度差只有 1 呢?这就需要引出文章的内容:四种操作,让普通排序二叉树变成平衡二叉树。
2024-05-28 11:20:30
1067
原创 二叉排序树的创建
二叉排序树就是节点经过排序构建起的二叉树,其有以下性质:1. 若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。2. 若它的右子树不为空,则右子树上所有节点的值均大于它的根节点的值。3. 它的左、右子树也分别为二叉排序树。
2024-05-25 19:41:57
409
原创 二叉树—先后序线索化和先后序线索遍历
后序遍历,递归操作在线索化之前,也就是说在改变左右孩子之前就已经遍历到目标节点,而先序的问题在于需要靠没有改变的左右节点遍历,但是中途有改变左右孩子的操作,所以遍历可能会出现问题。
2024-05-25 18:55:54
451
原创 二叉树的前中后序非递归遍历
上个文章是关于二叉树的创建和递归遍历的,关于非递归遍历,我看了很多文章,但还是感觉很抽象,没有套路可循,我也总结出了一些规律帮助理解。
2024-05-20 20:51:34
433
原创 二叉树的创建和遍历
首先说明一下为什么这里是二级指针,而没用struct TreeNode* 类型的函数然后返回,在链表中我们可以那样使用是因为 p->next=XXX,是解引用找到地址来连接起每个节点的,而在二叉树中,如果struct TreeNode* 类型的函数然后返回,首先返回值用不上,其次是一级指针传值调用导致创建失败。
2024-05-16 21:32:31
1059
原创 leetcode刷题——设计循环链表
通俗的来解释就是新增了一个节点,当队尾节点两次next后才找到队头节点说明容量满了,当队尾节点一次next后就找到队头节点就说明(队头节点一直出队列甚至把队尾节点出掉)队列空了。
2024-05-11 00:56:12
462
原创 用队列实现栈——leetcode刷题
题目的要求是用两个队列实现栈,首先我们要考虑队列的特点:先入先出,栈的特点:后入先出,所以我们的目标就是如何让先入栈的成员后出栈,后入栈的成员先出栈。
2024-05-05 00:38:51
1089
1
原创 用栈实现队列——leetcode刷题
我们可以把 栈1 理解为队列的真实情况,栈2 只是出队列时寻找队头的工具(负责逆序栈),每次出队列之后都要重新更新 栈1 ,更新队列。
2024-05-02 11:45:29
506
原创 C语言——队列的实现
队列按照先进先出(FIFO,First In First Out)的原则管理数据。这意味着最先进入队列的元素会被最先移出,类似于排队等候服务的情况。队列通常有两个主要操作:入队(enqueue),将元素添加到队列的尾部;出队(dequeue),从队列的头部移除元素。
2024-05-01 18:56:17
842
1
原创 C语言——栈的实现
栈(Stack)是一种基于先进后出(LIFO)原则的数据结构,类似于我们平常堆放书籍或者盘子的方式。栈通常是从高地址向低地址增长的,也就是说,栈顶位于较高的内存地址,而栈底位于较低的内存地址。这种结构通常被称为“向下生长的栈”或者“递减栈”。
2024-04-28 23:21:49
459
原创 双向循环链表(哨兵头节点)
双向循环链表的一大特点就是链表既可以向前找也可以向后找,循环意味着没有结束,这意味着如果遍历链表的指针与phead(哨兵位头节点)相等时链表结束(遍历指针为phead->next)。
2024-04-25 10:41:56
538
2
原创 链表带环问题——leetcode环形链表1 2
链表的带环问题指的是本该指向NULL的最后一个节点指向了之前的节点,导致链表成环,找不到尾结点的情况,那么我们该如何证明链表带环呢?知道了如何判断链表是否有环之后,如何找到入环的节点呢?
2024-04-19 22:37:18
1136
2
原创 链表传一级指针以及leetcode做题有感
上个文章说要传二级指针,经过一段时间的学习之后才知道可以传一级指针:之所以要传二级指针,是要改变一级指针的值,也就是把头节点的指针改变,如果头指针不发生改变,只改变中间链表的成员,那是否可以只传一级指针呢?答案是:可以。
2024-04-17 00:14:40
488
原创 链表的简单实现和为什么要传二级指针
而链表因为不是物理上连续存储的就可以充分利用内存空间,并简化了删除增加方面的操作。简单的来说,链表就是根据地址这条链,将元素串联到一起。例如:每个struct结构体中有两个成员,一个是要存放数据的类型,一个是结构体指针类型。
2024-04-14 12:27:22
2074
1
原创 leetcode刷题——只出现一次的数字123
1.两个相同的数字相异或结果是0(异或是指两个数字的二进制位相同为0,不同为1)2.0和任何数字异或都是那个数字
2024-04-11 21:06:31
596
1
原创 文件读写函数
简单来说,就是fopen函数接收文件名和打开模式两个参数(都是字符串类型所以用const char *),返回一种叫流(steam)的东西,即(FILE *类型),打开失败返回空指针。我觉得可以把流理解为文件指针类型,因为感觉和指针很像。
2024-04-07 00:23:53
1047
空空如也
学习率设置对于损失值的影响
2024-02-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人