八大排序 八 大 排 序 直接插入排序: 类似扑克牌游戏,每次插入时,都为其寻找一个合适的位置,越有序越快,稳定 平均时间复杂度:o(n*n) 最好时间复杂度:o(n) 空间复杂度:o(1) 2.希尔排序对大量的数据进行分组,减少时间复杂度。有一个增量序列,最后一个必须是1。跳跃式的排序,所以并不稳定时间复杂度:o(n^1.3)~o(n^1.5...
链表的环 链表有环的定义:单链表的尾节点指向了链表中间的某个结点。如图所示: 结点3就是环的入口点思路:我们采用快慢指针fast和slow来进行判断。这两个指针初始值均指向头,slow每次向前一步,fast每次向前两步,slow每次向前一步,如果该单链表有环,则它们必定会在环中相遇。如果fast遍历到尾部为NULL...
静态顺序表 #ifndef _SQLIST_H#define SIZE 10typedef struct Sqlist{ int elem[SIZE]; int length;}Sqlist;void InitSqlist(Sqlist *plist);bool Insert(Sqlist *plist,int pos,int val);bool Delete(Sqlist *plist,int pos);v...
动态顺序表 #ifndef _DSQLIST_H#define INIT_SIZE 10typedef struct DSqlist{ int *elem; int usedsize; int size;}DSqlist;void InitDSqlist(DSqlist *plist);static bool IsFull(DSqlist *plist);static void Inc(DSqlist *pl...
高级I/O函数 #includeInt dup(int file_descriptor)dup函数创建一个新的文件描述符,该新文件描述符和原有文件描述符file_descriptor指向相同的文件、管道或者网络连接。成功返回的文件描述符总是取系统当前可用的最小整数值。失败返回-1。#includeInt dup2(int file_descriptor_one,int file_descriptor_two)du...
静态库和动态库 库文件是预先编译好的方法的集合,一种可执行的二进制代码(但不可独立执行),可以被操作系统载入内存执行。Windows和linux二者的库的二进制是不兼容的。Windows系统静态库的扩展名为.lib,动态库扩展名为.dll。Linux系统静态库的扩展名为.a,动态库的扩展名为.so。Linux中有两种库:静态库和动态库(共享库)。静态库:1. 特点:程序在链接的过程当中,链接器从库文件中取得所需代...
TCP协议详解 TCP:面向连接,字节流,和可靠传输使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都必须要为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP连接是全双工的,即双方的数据可以通过一个连接进行。完成数据交换之后,通信双方都必须断开连接以释放系统资源。TCP:发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系。TCP如图所示:UDP如图所示:TC...
socket socket地址:是一个IP地址和端口对(ip,port),唯一的表示了使用TCP通信的一端。通用socket地址:表示socket地址的结构体:#includestruct sockadddr{ sa_family_t sa_family; char sa_data[14];};sa_family是地址族类型的变量。地址族类型通常与协议族类型相对应。 sa_data成员用于存放socket...
大小端模式 大端字节序(网络字节序):将低位字节存放在内存的高地址端,高位字节存放在内存的低地址端。小端字节序(主机字节序):将低位字节存放在内存的低地址端,高位字节存放在内存的高地址端。举一个例子:如何判断机器字节序?Linux提供了如下四个函数来完成主机字节序和网络字节序之间的转换:#includeunsigned long int htonl(unsigned long int hostlon...
线程 线程管理线程的概念:线程是进程内部的一条执行序列(执行流),每个进程至少有一条执行序列:main的执行体。进程可以通过线程库创建N条线程,这些新创建的线程称之为函数线程,main函数所代表的线程为主线程。线程在进程内部共享地址空间、打开的文件描述符、全局变量等资源。同时线程也有其私有的数据信息,包括:线程号、寄存器(程序计数器和堆栈指针)、堆栈、信号掩码、优先级、线程私有存储空间。引入线程的原因:...
消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度msgget函数 该函数用来创建和访问一个消息队列。它的原型...
共享内存 共享内存最为高效的进程间通信方式进程直接读写内存,不需要任何数据的拷贝 .为了在多个进程间交换信息,内核专门留出了一块内存区 .由需要访问的进程将其映射到自己私有地址空间 .进程直接读写这一内存区而不需要进行数据的拷贝,提高了效率多个进程共享一段内存,需要依靠某种同步机制,如互斥锁和信号量等共享内存编程步骤:创建共享内存 .函数shmget() .从内存中获得一段共享内存区域所需头文件#...
文件操作 Linux下的文件系统: 根目录/bin /home /root /usr /etc /dev/proc /lib ……/home:所有普通用户的家目录/home/stu:stu的家目录/bin:命令所对应的可执行文件/etc:系统的配置文件/proc:虚拟目录,内存的映射/root:超级管理员,root用户的家目录/dev:所有的接口设备文件/lib:系统使用的...
实现su命令 #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <assert.h>#include <sys/types.h>#include <pwd.h>#include <shadow.h&
判断一个数是有符号数还是无符号数 #include int main(){ unsigned int a=0; if(a { printf("unsigned"); } else { printf("signed"); }}打印结果为unsigned分析:如果a为无符号数,则a-1为有符号数,与操作符左边的类型不匹配,编译器会将a-1转换为无符号数,则表达式...
malloc/free和new/delete 1. malloc/free是函数,而new/delete是关键字。2. malloc成功后返回void *指针,需要强转,失败则返回NULL。new成功后返回指向对象的指针,失败抛出异常。虽然C++尽最大的可能去兼容C语言的特性,new失败也会返回NULL,但很少使用。3. malloc申请空间时要指明申请空间的大小,而new只需要对象名就可以了。4. ...
c和c++的区别 C语言是面向·过程的,C++是面向对象的。C++是在C语言的基础上发展而来的。C++兼容很多C语言的语法特性。1. C语言没有C++的class。但是C++把C语言中的struct进行扩充,当作类来使用,struct和class唯一不同的是struct的默认成员访问修饰符是public,class的默认成员访问修饰符是private。2. C语言中的const修饰的变量是常变量,不能用来定...
随笔 无论是指针变量还是普通变量,函数调用时传递的参数均是实参变量的一份拷贝,因为实参是局部变量({}内的变量),所以函数调用并不能修改实参本身,只能修改实参的一份拷贝。指针变量可以通过实参的一份拷贝修改指针所指向的变量。若想要使用修改的指针变量的实参的拷贝1. return2. 二级指针多维数组只能省略第一维的数组长度是由编译器决定,方便编译器推断数组的行数。避免使用全局变量,因为全局变量...
指针编程题 打印的是实际的数据。&a代表整个数组,&a+1则指向整个数组的下一个元素,所以ptr1[-1]代表数组的最后一个元素。a代表一维数组首元素首地址,(int)a+1则代表一个普通的整数,将上式再转换为一个指针,则该指针存放了数组第一个元素的第二个字节开始的连续四个字节。本题要考虑本机的数据存储模式(大端和小端,我的电脑是小端)...