- 博客(39)
- 收藏
- 关注
原创 数据结构---哈西表、算法
哈希算法:在记录的存储位置和它的关键字之间建立一种去特定的对应关系,使得每个关键字key对应一个存储位置;查找时,根据确定的对应关系,找到给定的key的映射。记录的存储位置 = f(关键字)我们把这种关系f称为哈希函数(散列函数);采用这种散列技术将记录存储在一块连续的存储空间,这块连续存储开空间称为哈希表或散列表。存储时,通过散列函数计算出记录的散列地址;查找时,根据同样的散列函数计算记录的散列地址,并按此散列地址访问记录。
2024-09-09 19:20:10
1246
原创 数据结构----树
1、树(Tree)是n(n≥0)个结点的有限集。n=O时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、……、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)2、树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。
2024-09-07 18:43:14
1416
原创 数据结构-----栈、队列
1、栈(stack)是限定仅在表尾进行插入和删除操作的线性表。把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。2、栈的插入操作:叫作进栈,也称压栈、入栈示。栈的删除操作:叫作出栈,也有的叫作弹栈。满栈、空栈:栈顶所在位置是否存有元素增栈、减栈:栈的增长方向。
2024-09-06 21:08:02
517
原创 数据结构—内核链表
操作函数:Linux内核提供了一系列宏和函数来简化内核链表的操作,如INIT_LIST_HEAD用于初始化链表头,list_add和list_add_tail用于插入节点,list_del用于删除节点,以及用于遍历链表的宏定义等。通过在结构体中包含一个指向链表节点的指针(如struct list_head类型),任何结构体都可以轻松地加入到链表中,而无需修改链表本身的结构。高效性:内核链表的操作(如插入、删除、遍历)通常通过宏定义实现,这些宏定义能够生成高效的代码,减少内核中的开销。
2024-09-05 22:13:07
470
原创 数据结构:双向链表
选择单向链表还是双向链表取决于具体的应用场景和需求。如果主要操作是遍历链表,且不需要频繁地进行随机访问或删除操作,那么单向链表可能是更好的选择。如果需要在链表中频繁地进行插入、删除或随机访问操作,那么双向链表可能更合适。1.内存泄漏:内存泄漏(Memory Leak)是指程序中已动态分配的内存由于某种原因程序未释放或无法释放,导致系统内存的浪费,严重时会导致程序运行缓慢甚至崩溃。这种情况在长时间运行的程序或大型系统中尤为常见,因为它会随着时间的推移逐渐累积未释放的内存。2.内存泄漏的原因。
2024-09-04 20:55:48
786
原创 数据结构--链表
一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,并在此基础上实现某个特定的功能的操作;程序 = 数据结构 + 算法。
2024-09-03 21:00:50
391
原创 sqlite3
create table 表名(列名1 数据类型 ,列名2 数据类型, 类名3 数据类型);errmsg :存储错误信息的地址。功能:在使用sqlite3_exec执行select语句时, 每查找到一条数据,则调用一次回调。insert into 表名 values(值1, 值2, 值3);column_value: 查找到的一行数据的每一列值的地址的集合。arg:当执行select语句时,使用到,传递给回调函数的第一个参数。column_name:查找到的一行数据的每一列列名的地址的集合。
2024-08-29 21:22:45
1060
原创 多路复用IO
4.select只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)4.poll只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)2.select监听的文件描述符集合在用户层,需要应用层和内核层互相传递数据。3.epoll会直接获得产生事件的文件描述符的信息,而不需要遍历检测。2.poll监听的文件描述符集合在用户层,需要内核层向用户层传递数据。2.epoll监听的事件表在内核中,直接在内核中监测事件效率高。4.epoll既能工作在水平触发模式,也能工作在边沿触发模式。
2024-08-28 21:18:43
229
原创 网络接口(2)
请注意,这个字段所表示数的单位是32位字(1个32位字长是4字节),因此,当P的首部长度为1111时(即十进制的15),首部长度就达到最大值60字节。ip.src == ip地址 and tcp.dstport == ip地址。(1)ip.src == ip地址 (2)ip.dst ==ip地址。(1)tcp.srcport == 端口号 (2)tcp.dstport == 端口号。(3)udp.srcport == 端口号 (4)udp.dstport == 端口号。
2024-08-23 20:12:17
914
原创 网络编程
功能:如果该函数在服务器端调用,则表示将参数1相关 的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。注意:如果是客户端,则该函数可以省略,由默认接口发送数据。sockfd 之前通过socket函数创建的文件描述符,套接字idmy_addr 是物理接口的结构体指针。表示该接口的信息。struct sockaddr ----------通用地址结构 --- ip + 端口。
2024-08-22 20:49:12
491
原创 共享内存、网络
是网络中主机的唯一标识,它由网络地址和主机号组成。网络地址是子网的唯一标识,类似于电话号码的区号;(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。即传输控制协议:是一种面向连接的传输层协议,它能提供高可靠性通信(即数。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。2. 在接收到数据,给出应答较困难的网络中使用UDP。据无误、数据无丢失、数据无失序、数据无重复到达的通信)2. 在需要可靠数据传输的场合,通常使用TCP协议。表示没有找到DHCP服务器。
2024-08-21 19:52:01
1191
原创 信号量与管道
信号量(可以顺序操作的一把锁)来描述 可使用的资源的个数(1)P操作表示 使用这个资源 资源个数减 1p操作逻辑尝试获取资源,有资源可用,直接使用,资源个数减一如果没有资源可用,此时等待(2).V操作表示 产生这个资源 资源个数加 1V操作逻辑释放一个资源如果此时有任务,在等待这个资源,这个资源直接给对应的任务如果没有任务需要使用这个资源,此时将资源个数加1(3) 信号量的分类:1、信号无名量 ==》线程间通信2、有名信号量 ==》进程间通信。
2024-08-16 19:38:31
784
原创 linux---互斥锁
1.线程 vs 进程线程 CPU执行的最小单位进程 资源分配和任务调度基本单位2. 各自特点 (优缺点)(1).创建 和 调度线程创建速度快调度速度快并发程度 更高(2). 安全性线程好处:共享了进程的数据空间共享数据方面 方便缺点:安全性不好带来资源竞争进程进程空间相互独立好处,安全性好缺点:进程间共享数据不方便 //进程间通信 (管道,信号,共享内存)线程间的资源竞争:共享资源: 临界资源。
2024-08-15 20:50:56
496
原创 linux---线程
retval //退出状态值 //传的是,退出状态值 对应的地址。attr 线程属性,一般是NULL,表示默认属性。b.线程 共享了进程的资源 (代码段,数据段,打开一些文件,信号等)start_routine -- 线程执行函数 (线程回调函数)retval --- 用来保存,退出状态值,所在空间的地址。主线程执行流结束,进程会在其余线程都结束后,结束。2. 其它的线程 --- 子线程(次线程)1. 主函数所在的执行流 --- 主线程。thread --- 线程tid。
2024-08-14 19:54:23
418
原创 进程----(2)
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。在进程创建成功后(1)、多任务,父子进程相同,名称相同(2)、父子进程执行程序不同,名称也不同shell 程序 ------bash。
2024-08-13 20:52:18
1006
原创 进程(process)
进程实体:text((正文) --代码段),data(已初始化的 全局变量 或 静态变量 )、bss(未初始化的 全局变量 或 静态变量)、堆、栈。程序 ----a.out ----- 可执行程序 .c ---- 程序源代码。ps -elf 主要查看父子进程 ps -elf grep 程序名。kill -9 a.out ---给所有叫a.ou的进程发送SIGKILL信息。子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。克隆的进程称为子进程,原有的进程称为 父进程。
2024-08-12 19:40:33
462
原创 linux系统文件与目录
根据用户id到/etc/passwd文件下解析获得。根据用户名到/etc/passwd文件下解析获得。根据gid到/etc/group文件中解析组信息。创建一个链接向oldpath文件的新符号链接文件。打印s字符串和errno对应的错误信息。oldpath:被链接向的文件的路径。newpath:创建的新硬链接文件。pathname:删除文件的路径。timep:保存秒数空间的地址。timep:保存时间空间的地址。成功返回获得时间字符串的首地址。newpath:新符号链接文件。oldpath:要链接向的文件。
2024-08-08 19:59:09
634
原创 linux系统编程
目录 当文件看,只不过操作函数和操作文件函数不一样。参数:opendir的返回结果中目录流对象。从目录流中读取文件信息并将保存信息的结构体。功能:关闭之前已经打开的目录流对象。成功返回包含路径空间的字符串首地址。buf:保存工作路径空间的首地址。pathname:目录文件的名字。buf: 属性存放空间的首地址。打开一个目录获得一个目录流指针。size:保存路径空间的长度。改变当前程序的工作路径。path:改变到的路径。pathname:路径。path: 文件的路径。dirp:目录流指针。
2024-08-07 20:10:25
416
原创 Linux系统编程—缓冲区、文件io、read、write、lseek
3文件描述符:很小的非负的整数 int 0-1023。行缓冲,1k, terminal,主要用于人机交互stdout。无缓冲,0k 主要用于出错处理信息的输出 stderr。O_CREAT,0666 创建1个文件,给666的权限。一般都是对设备文件操作,当然也可以对普通文件进行操作。一个基于Linux内核的没有缓存的IO机制。内核每打开一个文件就会获得一个文件 描述符。.2 操作对象不在是流,而是文件描述符。对普通文件进行标准IO操作,建立。通过文件描述符读取文件中的数据。
2024-08-06 20:22:11
417
原创 Linux系统编程fputc,fgetc,fputs,fgets,fwrite,fread
eg : ====》stdio.h ===>stdio.c==>libc.so ==>/usr/lib so 动态库。7种,d ,-,l,p管道,s, ,c,b 用命令演示 link pip socket。I: 键盘是标准输入设备 ====》默认输入就是指键盘 /dev/input。man xxx == man 1 xxx ===>查看当前xxx命令。man 3 xxx ===》查看xxx对应的标准库函数。文件内容的分类, 文本文件,二进制文件。流对象 ===》头 《===数据====》尾。
2024-08-05 20:27:04
1034
原创 结构体与链表
声明变量体的一般形式为struct 结构体名{成员表列};在花括号{ }后要加分号“结构体名”用作结构体类型的标志,它又称“结构体标记”。花括号内是该结构体中的各个成员,由它们组成一个结构体。对各成员都应进行类型声明,即类型名 成员名;也可以把“成员表列” 称为“域表”。每一个成员也称为结构体中的一个域。成员名命名规则与变量名相同。
2024-08-01 19:27:52
442
原创 指针数组和指向指针的指针
p的前面有两个*号,即**p, 相当于* ( *p), *p是指针变量的定义形式。如果没有最前面的* ,那就是定义了一个指向字符数据的指针变量。现在它前面又有一个*号,表示指针变量p是指向--个字符指针变量(即指向字符型数据的指针变量)的。* p就是p所指向的另一个指针变量。指针数组的每一个元素都相当于一个指针变量。a【i】【j】等价于*(*(a + i )+ j ) 表示第i行第j列元素。函数名为函数自身的入口地址,间接访问函数,用于降低程序的耦合性。*(a+i)与a【i】与a+1等价,都表示首地址。
2024-07-31 19:54:31
295
原创 C语言——指针
使用 malloc函数在堆区分配动态内存空间。函数声明为 void*malloc(size tsize);申请成功返回申请该内存的指针,如果分配失败则返回空指针NULL。在在指针变量前加const说明无法通过指针修改指针所指向的变量,const修饰的不是指针变量本身,而是指针所指的变量,变成只读变量,不可修改。void *p 为万能指针。可以接受任意地址和指针,但是不能进行指针运算。使用 free 函数释放先前分配的内存。释放p所指向的内存空间,释放后应将ρ置为NULL以避免悬空指针。
2024-07-30 20:27:21
185
原创 C语言—指针
i = 100 直接访问 *p = 100 间接访问。定义指针变量的一般形式为 : 基类型 指针 变量名;“int *p” 指针变量 此时“ * ”为类型说明符。3、将偏移好的那部分内存空间当作是一个基类型变量来看。*p+n 向后偏移 n * sizeof(基类型)2、从定位处开始向后偏移 sizeof(基类型)*p “*”为指针运算符,间接访问某变量。1、通过指针变量中的值到内存空间中定位。基类型:指针变量装什么类型的地址。指针是用来装地址的数据类型。
2024-07-29 18:13:57
206
原创 标识符和预处理命令
作用域分局部作用域和全局作用域;局部作用域指在{ }内的作用域;全局作用域指没有在{ }内的作用域;所有的函数名都在全局作用域;全局变量前可加‘g__’前缀。全局变量若未被初始化,则自动以位模式清零。
2024-07-28 20:43:40
478
原创 函数的嵌套调用
C语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能包含另一个函数,C语言不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数,如图:图8表示的是两层嵌套(包括main函数共3层函数),其执行过程是:(1)执行 main函数的开头部分;(2)遇函数调用语句,调用函数a,流程转去a函数;(3)执行a函数的开头部分;(4)遇函数调用语句,调用函数b,流程转去函数b;
2024-07-25 20:00:18
1168
原创 二维数组的应用
二维数组的定义方式:数据类型 数组名[常量表达式][常量表达式];二维数组可被看做特殊的一维数组;它的元素又是一个一维数组C语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第一行的元素,再存放第二行的元素二维数组可省略行数 a[i][j] 可写为:a[][j]a[0]或a(整个数组)是首元素地址数组名不能整体赋值(用strcmp,strcpy)行数:rows = sizeof(a) / sizeof(a[0])
2024-07-24 20:34:45
205
原创 C语言—字符数组
6、strcpy(s2,s1) 将s1拷贝到s2 不能使用赋值运算符。8、strcmp strcmp(s1,s2) 不能使用关系运算符。用来存放字符数据的数组就是字符数组,字符数组中一个元素存放一个数组。2、"%s"对字符串输入输出。将一个字符串(以‘\0结束的字符序列’)输出 puts(s)'\o' 字符串结束标志。且'\o'占一个字节且不显示。输出字符不包含'\o';且输出遇到'\0',结束输出。例:char s[100] = "hello"1.字符逐个输入输出。
2024-07-23 19:37:09
248
原创 一维数组的定义与引用
(3)常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。数组是有序数组的集合。用一个统一的数组名和下标来唯一地确定数组中的元素。(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。计算数组中元素的个数:int len = sizeof (a)/ sizeof(a[0]);数组必须先定义,然后使用。选择排序:在数组合适的位置上放上合适的数。数组的数组名代表数组的首元素地址。
2024-07-22 20:52:12
254
原创 学习第6天
它是这样执行的:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。(2)求解表达式2, 若其值为真(值为非0),则执行 for语句中指定的内嵌语句,然后执行下面第(3)步。表达式为非0值时,执行while语句中的内嵌语句,其流程图见图6-1。
2024-07-20 19:55:41
340
原创 学习第5天
在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。C语言编译系统在表示逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即将一个非零的数值认作为“真”。(2)当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。关系表达式的值是一个逻辑值,即“真”“假”。
2024-07-19 21:04:46
213
原创 学习嵌入式第4天
即只有一个分号的语句,什么也不做。在键盘输入信息时,并不是敲一个字符就立即送到计算机中,而是暂时放在了缓冲区中,只有按下Enter后才将这些字符送到计算机中,并且按先后顺序分别赋给相应的变量。注意:getchar函数只能接收一个字符,getchar函数得到的字符可以赋值给一个字符变量或整形变量,也可以不赋给任何变量,作为表达式的一部分。一般格式为:printf(格式控制,输出列表)如:printf(“%d,%c\n",i,c)x,X:输出无符号的十六进制的整数(x输出小写的a~f,X,为大写)
2024-07-18 19:52:34
327
原创 C语言运算
运算优先级:初等运算符> 单目运算符> 算术运算符> 关系运算符> 逻辑运算符> 条件运算符> 复制运算符>逗号运算符。right value(rvalue):右值。常量为右值,匿名变量为右值。” 此时“i”为只读变量,仍为左值。二、混合运算:在进行运算时,不同的数据类型要转换为同一类型,再计算。又称为“顺序求值运算符”。left value(lvalue):左值。可以利用强制类型转换运算符将一个表达式转换为所需类型。例:(int)x+y 只将x转换成整型与y相加。通常使用“&”来判断左右值。
2024-07-17 19:26:44
184
原创 C语言数据类型——基本类型
但注意,字母e(E)之前必须有数字,且e后面的指数必须位整数。字符型变量用来存放字符常量,它只能放一个字符,不要以为在一个字符变量中可以放一个字符串(包括若干字符)。如'a', 'A', 且'a' 与'A‘是不同的字符常量。在所有的编译系统中都规定以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。(3)十六进制数,以0x开头,如:0x123表示十六进制数。(2)八进制数,以0开头,如:0123表示八进制数123。
2024-07-16 18:21:14
318
原创 linux文件基本操作
d: 通常,如果指定了一个目录,Is命令会列出目录中的内容而不是目录本身。将此选项与-1选项结合使用,可查看目录的详细信息,而不是目录中的内容。-F: 选项会在每个所列出的名字后面加上类型指示符(例如,如果名字是目录名,则会加上一个斜杠)-a: 列出所有文件,包括以点号开头的文件,这些文件通常是不列出来的(比如隐藏的文件)-h :以长格式列出,以人们可读的方式而不是字节数来显示文件大小使用长格式显示结果。-l:以相反的顺序显示结果。-s:按文件大小对结果排序。1.ls:列出目录内容。
2024-07-15 18:51:09
174
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅