
工欲善其事
文章平均质量分 82
Cyrus_wen
这个作者很懒,什么都没留下…
展开
-
linux下使用vim实现基于静态数组的顺序表的一些基本操作
本篇博客将介绍实现基于静态数组的顺序表的一些基本操作: 初始化 尾插 尾删 头插 头删 在任意位置插入元素删除任意位置元素获取任意位置元素 修改任意位置元素 查找指定元素值的下标 删除所有元素冒泡排序本次介绍的编译平台是linux,编辑器是vim为了实现静态数组的顺序表,我们需要建立一个结构体用来存放数组和数组中实际元素个数。typedef struct ...原创 2018-03-15 23:15:12 · 516 阅读 · 0 评论 -
排序算法
稳定性:排序之后,相同排序码一样的和排序之前顺序一样。 #include <stdio.h>#include <stdint.h>///////////////////////////////////////////////////////////////冒泡排序//时间复杂度:O(N ^ 2)//空间复杂度:O(1)//稳定性:稳定排序/////...原创 2018-05-26 10:54:26 · 211 阅读 · 0 评论 -
哈希表变形 -- 位图
位图位图可以表示数字存在与否 布隆过滤器可以表示字符串存在与否#pragma once#include <stdint.h>typedef struct Bitmap{ uint64_t* data; uint64_t capacity;} Bitmap;int BitmapTest(Bitmap* bm, uint64_t index);...原创 2018-05-21 21:34:32 · 246 阅读 · 0 评论 -
布隆过滤器课堂代码
bloom.h#pragma once#include "bitmap.h"#define BloomHashCount 2typedef uint64_t (*BloomHash)(const char*);typedef struct BloomFilter{ Bitmap bm; BloomHash bloom_hash[BloomHashCount];}...原创 2018-05-21 21:32:56 · 1132 阅读 · 0 评论 -
哈希表笔记
MD5: - 不管字符串多大,生成的MD5长度都是16或32位。 - 几乎不可逆 - 字符串改变,MD5变化很大typedef enum{ Empty;//空状态 Valid;//有效状态 Deleted //被删除的状态} Stat;//哈希表存储的是 键值对typedef int KeyType;typedef int CalType;ty...原创 2018-05-18 20:23:59 · 254 阅读 · 0 评论 -
来来来,进程信号了解一下
本篇博客将重点介绍一下进程信号的基本概念以及相关知识点。 在开始之前,我们先来看一张图: 先大体有些印象,然后我们开始后面的介绍。信号的概念我们通过一个熟悉的场景来理解一下什么是信号: 1、用户输入一个命令,在shell下启动一个前台进程。 2、用户按下Ctrl + c ,这个键盘输入产生一个硬件中断。 3、如果cpu正在执行这个进程的代码,则该进程的用户空...原创 2018-04-27 17:55:51 · 611 阅读 · 0 评论 -
栈常见的面试题
之前我们学习了栈,现在介绍一下栈常见的面试题。 常见面试题之一: 最小栈 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间 复杂度为O(1) 关于如何实现最小栈,我们有两种思路。 思路一:我们设置两个栈,一个栈存放最小元素,另外一个栈存放栈内的数据。 思路二:我们利用一个栈,每次入栈时都入两个元素,第一个是要入栈的元素,出栈时也出两个元...原创 2018-04-25 16:57:01 · 1075 阅读 · 0 评论 -
关于封装fork/wait等操作, 编写函数 process_create(pid_t* pid, void* func, void* arg)的解答
process_create(pid_t* pid, void* func, void* arg)函数里的pid是func回调函数就是子进程执行的入口函数, arg是传递给func回调函数的参数。这里用到了回调函数,关于回调函数的介绍可以参考这位大佬的博客:tingsking18老铁的博客#include <stdio.h>#include <unistd.h&...原创 2018-04-21 13:28:18 · 311 阅读 · 0 评论 -
利用fork函数实现myshell
在学习完fork、wait、waitpid、exec等函数,我们可以实现一个简单的myshell函数。 来来来,直接上代码。 我们采用的是execvp()程序替换,也就是带环境变量用数组#include <stdio.h>#include <unistd.h>#include <sys/wait.h>#include <string.h&...原创 2018-04-21 13:10:16 · 913 阅读 · 0 评论 -
哈希表的简单介绍
哈希表的概念 哈希表(Hash Table)也叫散列表,是根据键码值(key value)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找速度。这个映射函数就叫做散列函数,存放记录的数组的散列表。哈希表查找的时间复杂度 哈希表存储的是键值对,其查找的时间复杂度与元素数量的多少无关,哈希表在查找元素的时候通过计算哈希码值来定位元素的位...原创 2018-06-11 16:24:08 · 534 阅读 · 0 评论 -
hash表的具体实现
闭散列hash1.c#include "hash1.h"#include <stdio.h>#include <stddef.h>void HashInit(HashTable* ht, HashFunc hash_func){ if(ht == NULL){ return; } ht->size = 0;...原创 2018-06-11 16:25:05 · 268 阅读 · 0 评论 -
非阻塞IO
非阻塞IO如果内核还没有将数据准备好,系统调用会直接返回,并且返回EWOULDBLOCK错误码。首先介绍一下函数fcntlfcntl#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd, .../*arg*/);//传入的cmd不同,后面的参数不一样fcntl有下面5...原创 2018-08-15 16:45:43 · 284 阅读 · 0 评论 -
5种高级IO
高级IO五种IO模型阻塞IO⾮阻塞IOIO多路转接异步IO信号驱动IO阻塞IO 在内核将数据准备好之前, 系统调⽤会⼀直等待. 所有的套接字, 默认都是阻塞⽅式。非阻塞IO 如果内核还未将数据准备好, 系统调⽤仍然会直接返回, 并且返回EWOULDBLOCK错误码。 ⾮阻塞IO往往需要程序员循环的⽅式反复尝试读写⽂件描述符, 这个...原创 2018-08-15 16:07:59 · 356 阅读 · 0 评论 -
指针和引用
首先我们来介绍一下什么是引用: - 引用 引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名。定义的格式: 类型 &引用变量名 = 已定义过的变量名void TestReferencl() { int a = 1; int b = a; cout<<"a:address->"<<&a&...原创 2018-07-07 00:27:53 · 199 阅读 · 0 评论 -
http错误码
get、post 区别:带不带参数不同包括“ ?”一定带参,?之前表示请求的资源,之后表示参数。一定用cgi请求形式.错误码:2xx204:请求被处理,但是没资源206:支持断点续传3xx301:永久性重定向。 需要进行书签引用的变更<=====>资源的URI已经更新,你也更新下你的书签吧 302:临时重定向 307...原创 2018-06-29 00:04:22 · 294 阅读 · 0 评论 -
哈希表开散列与闭散列的实现代码
闭散列hash1.c#include "hash1.h"#include <stdio.h>#include <stddef.h>void HashInit(HashTable* ht, HashFunc hash_func){ if(ht == NULL){ return; } ht->size = 0;...原创 2018-06-29 00:02:39 · 326 阅读 · 0 评论 -
计算机网络知识点总结
一、选择题(15 * 2’) 二、名词解释(5 * 4’) 三、简答题(4 * 5’) 四、计算题(3 * 10’)第一章计算机网络的两项主要技术是通信技术和计算机技术计算机网络的定义 以实现远程通信为目的,一些互联的、独立自治的计算机的集合。计算机网络的分类 根据不同的拓扑结构:星型、树状、总线形、环形、网格形 根据不同的覆盖范围:互联网...原创 2018-07-11 08:29:33 · 1029 阅读 · 0 评论 -
C++复习笔记(一)
c++学习笔记c和c++ 的联系。c几乎是c++的一个子集,c支持的语法在c++中基本都支。cplusplus,在c语言的基础上又有了许多新的特性。C++的关键字 asm do if return typedef auto double inline short typeid bool dynamic_cast...原创 2018-07-02 16:27:35 · 347 阅读 · 0 评论 -
排序算法(二)
### 排序算法(二)```c///////////////////////////////////////////////////////////////归并排序(递归)//时间复杂度:O(N * logN)//空间复杂度:O(N)//稳定性:稳定排序////////////////////////////////////////////////////////////void...原创 2018-05-28 21:31:16 · 204 阅读 · 0 评论 -
popen/system与fork函数
首先来介绍一下fork函数 fork用来创建一个子进程。一个程序一调用fork函数,首先,系统让新的进程与旧的进程使用同一个代码段,因为它们的程序还是相同的,对于数据段和堆栈段,系统则复制一份给新的进程,这样,父进程的所有数据都可以留给子进程,但是,子进程一旦开始运行,虽然它继承了父进程的一切数据,但实际上数据却已经分开,相互之间不再有影响了,也就是说,它们之间不再共享任何数据了。而如果两...原创 2018-04-20 15:51:17 · 786 阅读 · 0 评论 -
线程控制
线程控制POSIX线程库 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的 要使用这些库函数,要引入头文件 pthread.h 链接这些线程函数库时要使用编译器命令“-lpthread” 选项 创建线程:int pthread_create(pthread_t* thread, const pthread_attr...原创 2018-05-01 21:48:05 · 200 阅读 · 0 评论 -
信号量&同步与互斥
在介绍信号量&同步与互斥之前,我们先来了解一下生产者与消费者模型。 生产者将数据放入缓冲区,消费者将数据从缓冲区取走消费。生产者消费者的模型提出了三种关系,两种角色,一个场所三种关系: - 生产者之间的互斥关系 - 消费者之间的竞互斥关系 - 生产者和消费者之间互斥和同步关系(同一时刻只能有一个,要么在生产,要么在消费,这就是互斥关系,只能在生产者生产完了之后才...原创 2018-04-08 11:28:19 · 2653 阅读 · 0 评论 -
linux下消息队列的查看与删除(ipcs&ipcrm的使用)
ipcsipcs -q : 显示所有的消息队列ipcs -qt : 显示消息队列的创建时间,发送和接收最后一条消息的时间ipcs -qp: 显示往消息队列中放消息和从消息队列中取消息的进程IDipcs -q -i msgid: 显示该消息队列结构体中的消息信息:ipcs -ql : 显示消息队列的限制信息:取得ipc信息:ipcs [-m|-q|-s]-m 输出有关...原创 2018-04-08 00:03:30 · 23664 阅读 · 0 评论 -
进程间通信之消息队列
前面我们介绍了进程间的通信方式之管道,接下来我们将介绍另外一种进程间的通信方式:消息队列消息队列一、什么是消息队列?消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法每个数据块都被认为有一个类型,接收者进程接受的数据块可以有不同的类型值消息队列也有和管道一样的不足,每个消息的最大长度(MSGMAX)、每个消息队列总的字节数(MSGMNB)、系统消息队列的总数(M...原创 2018-04-07 23:52:37 · 1365 阅读 · 0 评论 -
进程间通信之管道篇
在介绍管道之前,我们先了解一下进程间通信。进程间通信进程间通信目的:数据传输:一个进程需要将它的数据发送给另一个进程。资源共享:多个进程需要共享同样的资源。通知事件:一个进程需要向另一个进程发送消息,通知它发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程需要完全控制另一个进程的执行(如Debug进程),此时控制进程希望拦住另一个进程所有陷入和异常,并能够及...原创 2018-03-25 16:14:30 · 334 阅读 · 0 评论 -
c语言实现单链表的基础操作
接下来将介绍c语言实现单链表的一些基础操作: 1. 初始化单链表 2. 创建链表的节点 3. 打印链表 4. 销毁链表 5. 尾部插入链表 6. 尾部删除链表 7. 头部插入元素 8. 尾部插入元素 9. 指定位置前插入元素 10. 指定位置后插入元素 11. 删除元素 12. 删除指定元素 13. 删除所有相同元素 14. 判断链表是否为空 15. 求链表长度...原创 2018-03-24 12:15:46 · 784 阅读 · 1 评论 -
操作系统的进程调度算法
操作系统的进程调度也称 dispatcher,其实简单来说操作系统的进程调度不外乎人类社会的两大原则:先来后到和优先级, 一个良好的任务调度算法主要体现在以下几个方面:公平的保证每个进程得到合理的cpu时间高效的使cpu保持忙碌状态即总有进程在cpu上运行使交互用户的响应时间尽可能短周转时间使批处理用户等待输出的时间尽可能短单位时间内处理的进程尽量多调度方式基本分为以下两大类:...原创 2018-03-19 00:10:02 · 1780 阅读 · 0 评论 -
Linux根目录下部分文件夹的作用简介
工与善其事,必先利其器。接下来我们将简要介绍Linux操作系统下根目录的个各文件夹的作用/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /proc 正在运行的进程也称作文件,存放在该目录下/boot 操作系统启动的相关文件/var 自己安装的程序文件存放位置,某些大文件的溢出区,比方说各种服务的日志文件/home 用户主...原创 2018-03-03 17:33:28 · 307 阅读 · 0 评论 -
linux在进入目录时需要哪些权限,在执行增删查改文件动作需要哪些权限
在进入目录时需要哪些权限 r –read 权限 w –write 权限 x –修改可执行权限我们可以做如下测试: 1、建立文件夹 test: mkdir test 可以看到我们创建的文件夹拥有r、w、x 权限。2、接下来,我们将权限全部去掉:chmod 00 test cd test 提示权限不够3、加上 r 、w 权限:chmod u+w test 、 ...原创 2018-03-16 00:18:59 · 276 阅读 · 0 评论 -
linux下实现简单的彩色进度条程序
我们在linux下安装软件时经常会看到一个进度条,就像下面这样: [########################################################][100%][/]那么,我们有没有办法实现一个简单的进度条呢?linux下的进度条配色太单调,我们有没有办法实现一个彩色的进度条呢?想想都有趣,下面就让我们来操作一下吧!其实,几行代码就可以模拟出来一个简单的...原创 2018-03-26 11:22:47 · 623 阅读 · 5 评论 -
Linux下用单链表实现一个电话本
完成了链表的学习,我们可以尝试写一些小的案例练习链表的操作。 下面我来为大家介绍用单链表实现一个简单的电话本程序。首先我们分析一下一个完整的电话本应该包含以下功能: 1.添加联系人 2.删除联系人 3.修改联系人 4.查找联系人 5.查看所有联系人 6.清空联系人 而修改练习人又可能包含以下选项: (1)修改姓名 (2)修改性别 (3)修改年龄 (4)修...原创 2018-04-05 14:27:16 · 639 阅读 · 0 评论 -
来来来,线程基本概念了解一下~~~
线程的概念那么什么是线程呢? 百度百科是这样介绍的: 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进...原创 2018-05-01 19:48:33 · 181 阅读 · 0 评论 -
GDB调试多进程
默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。 follow-fork-mode detach-on-fork 说明parent ...原创 2018-05-01 18:59:14 · 232 阅读 · 0 评论 -
可重入函数
如上图所示,在一个链表的插入函数中,main函数调用Insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步时,因为硬件中断使进程切换到内核,再次回到用户态之前监测到有信号待处理,于是切换到sighandler函数,sighandler函数也调用Insert函数向同一个链表插入节点node2,插入操作两步都做完之后,返回用户态,就从main函数调用Insert函数...原创 2018-04-30 17:53:26 · 165 阅读 · 0 评论 -
简单的sleep函数以及不是那么简单的sleep函数
前面的博客进程信号中我们简单地介绍了一下关于进程信号以及信号捕捉的一些基本知识。下面我们就用学到的基本知识来实现一个简单的sleep()函数。首先了解一下sigaction结构体 struct sigaction { __sighandler_t sa_handler; unsigned long sa_flags; ...原创 2018-04-30 17:07:07 · 1012 阅读 · 0 评论 -
链式队列和顺序队列
首先来看一下百度百科关于队列的介绍: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列满足先进先出(FIFO)的原则,我们可以用链表的尾插头删模拟队列,还可以用顺序表实现循环队列。 下面介绍一下循环栈: seq...原创 2018-04-13 17:16:15 · 1242 阅读 · 0 评论 -
顺序栈和链式栈
首先来看一下百度百科关于栈的解释: 定义:栈是限定仅在表头进行插入和删除操作的线性表。要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。”栈“者,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。栈满足先进后出,接下来我们分别用顺序表和链表来实现一下栈。 申明:下面的代码是是一个粗糙版本的链式...原创 2018-04-13 00:32:32 · 1434 阅读 · 0 评论 -
双向链表的一些基本操作
双向链表前面的博客向大家介绍了单链表,我们发现单链表在进行查询、删除、添加、修改链表的值时都需要遍历整个链表,这样无疑增加了对链表操作的时间复杂度。而双向链表由于有一个prev指针,这样可以更快的找到前一个节点,减小了时间复杂度,但是,相对应的,由于多开辟了个新的指针,会增加空间复杂度。单链表和双向链表就是一个用空间换时间的例子比如快餐店订餐时就适合单链表,因为一般领餐后不需要叫上一个顾客...原创 2018-04-06 17:06:29 · 271 阅读 · 0 评论 -
链表常见例题
在各大考试中,链表是一个十分重要的考点,本篇博客将着重介绍几道常见的关于链表的例题。从尾到头打印链表删除一个无头单链表的非尾节点(不能遍历链表)在一个无头单链表的一个节点前插入一个节点(不能遍历链表)单链表实现约瑟夫环逆置/反转单链表单链表冒泡排序合并两个有序链表找到链表的中间节点查找单链表倒数第k个节点(要求只能遍历一遍链表)删除链表的倒数第k个节点判断单链表是否带环,...原创 2018-04-05 18:07:20 · 1138 阅读 · 2 评论 -
重定向
重定向dup/dup2系统调用函数原型:#include <unistd.h>int dup(int oldfd);int dup2(int oldfd, int newfd);使用dup将标准输出重定向到文件中int main(){ int fd = open("./log", O_CREAT | O_RDWR); if(f...原创 2018-08-15 18:04:21 · 307 阅读 · 0 评论