C语言
ALfirewell
本人的目标是当一名嵌入式研发工程师,会把自己学习的历程以及自己的发现和心得记录下来,但愿最后能如愿以偿。
展开
-
Redis基础-简单动态字符串SDS
在Redis中没有直接使用C语言传统的字符串,而是自己构建了简单动态字符串SDS,那么为什么Redis需要自己构建字符串呢?首先Redis用作缓存数据库,对于存储速度要求是非常苛刻的,传统的C字符串对于字符串的操作比如strcat每次都需要重新划分空间,涉及到系统调用以及内存分配算法等会占用修改字符串的大部分时间,这当然不是我们想看到的,再比如我们计算传统的C字符串长度我们要调用strlen函数去获取,这里的时间复杂度就是O(N),而是用动态字符串SDS的时间复杂度就是O(1),下面就来揭晓原因:S原创 2021-01-05 16:58:42 · 205 阅读 · 0 评论 -
红黑树-2 添加
前一篇博客介绍了红黑树的性质和旋转,这一片将具体介绍下红黑树的添加。在介绍红黑树的添加之前大家首先要理解这几点:1.红黑树在插入之前就已经是红黑树了2.当前要插入的节点必须是红色(不会影响黑高)3.父节点是红色的时候需要进行调整(父节点是红色它的孩子节点必须是黑色),祖父节点肯定是黑色的,叔父节点可能是红色可能是黑色。对于父节点和叔父节点都是红色的情况不需要进行左旋和右旋,可以直接通过改变颜色去保证红黑树。对于父节点是红色,叔父节点是黑色的情况必须通过旋转去保证红黑树。这种情况下还要区分当前插入原创 2020-09-20 23:34:11 · 149 阅读 · 0 评论 -
红黑树-1 介绍与旋转
红黑树是基于二叉树的一种非常重要的数据结构,它在二叉树的基础上加上了一下五点的限制,这也是红黑树的性质:1.每个节点是红色或者黑色2.根节点是黑色3.每个叶子节点是黑色4.如果一个节点是红色,那么它的两个孩子都是黑色5.对每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑节点这里重点要理解第四和五点根据这五点性质我们可以推断出第二张图是符合红黑树性质的。接下来介绍下红黑树的旋转:红黑树存在左旋和右旋两种,在插入节点和删除节点的时候需要进行旋转来调整红黑树使其始终满足上面介绍的五条原创 2020-09-20 23:07:33 · 251 阅读 · 0 评论 -
栈的原理与实现
栈是一种数据结构,它包括入栈和出栈,先入的放在最底下最后才会出栈。其实栈是非常简单和容易理解的,下面是我写的一个C语言小用例:#include <stdio.h>#include <stdlib.h>#include <assert.h>#define ALLOC_SIZE 512typedef int KEY_TYPE;typedef struct _stack{ KEY_TYPE *base; int top; int stack_size;}原创 2020-09-20 22:44:52 · 115 阅读 · 0 评论 -
快速排序的实现和总结
快速排序是在面试中经常被问到的一种排序,首先来介绍一下它的基本思想:选取一个哨兵(通常选择最左边的那个)作为一个关键元素,然后通过排序使得哨兵处于一个这样的位置:哨兵左边的数都比它要小,右边的数都比它要大,然后对其左边和右边的集合同样进行这样的操作,直至左右区间只有一个数为止。void quick_sort(int * data, int left, int right){ int i,j, key; if(left > right) return ; key = data[left]原创 2020-09-13 17:47:33 · 116 阅读 · 0 评论 -
希尔排序的实现与总结
希尔排序是经过分组的插入排序,那么怎么理解呢?在此之前我们先来再次认识一下插入排序。我们可以看到对于插入排序,前面的元素都是有序的,后面有新的元素插入进来时我们只需要找到对应的位置插入进来即可。void insert_sort(int * data, int length){ int i, j, temp; for(i = 1; i < length; i++) { temp = data[i]; for(j = i - 1; temp < data[j]; j--)原创 2020-09-13 14:39:47 · 217 阅读 · 0 评论 -
文件隐藏属性chattr,lsattr
有时为了满足特定的要求,需要为文件设置特殊的属性,也就是隐藏属性。 下面我来列举一下两个比较重要的隐藏属性。 我们可以通过chattr来设置文件隐藏属性 例如: chattr -i 文件名 通过-i参数对文件的设置,可以使该文件不能被删除,更名,设置连接也无法写入或者添加数据。 注意:只有root才能设置此属性。 chattr -a 文件名 通过-a参数的设置,可以使文件只能增加数...原创 2018-04-20 12:06:18 · 344 阅读 · 0 评论 -
静态与局部的区别与选择
静态全局变量和普通全局变量的区别: 相同点: 静态全局变量和普通全局变量都存放在全局数据区,如果不初始化的话默认值都为0。 不同点: 作用域不同: 普通全局变量的作用域是整个工程,也就是整个工程中的不同文件可以共享全局变量,而静态全局变量的作用域只包含它自己的源文件,在其他源文件中是不能访问它的。静态局部变量和普通局部变量的区别: 1.存储位置不同: 静态局部变量存储在全局数据区...原创 2018-04-20 23:43:06 · 309 阅读 · 0 评论 -
使用write函数遇到的问题
write有两种用法。一种是:ssize_t write(int fd, const void *buf, size_t nbyte); fd:文件描述符; buf:指定的缓冲区,即指针,指向一段内存单元; nbyte:要写入文件指定的字节数; 返回值:写入文档的字节数(成功);-1(出错) write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错...原创 2018-04-26 20:25:46 · 4037 阅读 · 0 评论 -
C/C++引用必须为左值的问题详解
我们常常会遇到这样的问题: const int&amp; a = 101;//对 int&amp; b = 101;//错例子: int a; int &amp;b = a; a = 10; printf(“b = %d\n”,b); 此时b = 10,b是a的引用,就是说b和a的地址相同,对a做改变b也跟着变化。 那么这是为什么呢? 下面我们...原创 2018-08-10 09:27:47 · 2727 阅读 · 0 评论 -
陷阱之有符号无符号字符型数组
请看下面这段代码:#include <stdio.h>#include <string.h>int main(){ char a[1000]; int i; for(i=0;i<1000;i++) { a[i]=-10-i; } printf("%d\n",strlen(a)); print...原创 2018-08-10 09:54:27 · 2440 阅读 · 2 评论 -
系统的大端模式与小端模式
大端模式:高字节存放高地址 小端模式:高字节存放低地址 下面举个例子: 有int型数据0x12345678存放在地址0x00开始处,则大小端存放方法见下图 那么怎么验证系统是大端还是小端模式呢? 下面推荐两种方法: 1.用联合体来验证:include <stdio.h>int checknum(){ union check { ...原创 2018-08-10 10:45:25 · 359 阅读 · 0 评论 -
字符数组和字符指针的区别
我们经常会碰到这样的问题: char *p = “xyz”; char *q = “xyz”; char pa[] = “xyz”; char qa[] = “xyz”; 以下说法正确的是: A、p和q指向同一块地址 B、p和q的内容可以修改 C、pa内容修改后qa的内容也被修改 D、pa和qa指向同一块地址正确答案:D分析: p和q是指针,指向同一块字符串常量区,内容...原创 2018-08-10 11:11:37 · 238 阅读 · 0 评论 -
文件与目录的默认权限
文件默认权限:umask umask就是指目前用户在新建文件或目录的时候的默认权限。[root@localhost 文件]# umask 0022 [root@localhost 文件]# umask -S u=rwx,g=rx,o=rx直接输入umask,显示的是数字形态的默认权限。 那么它代表什么意思呢? 在Linux中,文件不应该有执行的功能,所以文件的最大权限为666,...原创 2018-04-20 11:51:40 · 681 阅读 · 0 评论 -
C语言中的变长数组
学过C语言和C++的人都知道,我们在定义数组时用的都是整型的常量,那么大家有这样去定义过一个数组吗?#include <stdio.h>int main(int argc, char **argv){ int c, d,i,j; scanf("%d %d",&c,&d); int m[c][d]; for(i = 0;i &...原创 2018-04-06 22:14:44 · 3251 阅读 · 0 评论 -
Linux修改文件权限以及属性的方法
上次讲到怎么查看文件的权限以及文件的属性,那么在一些场合你要修改文件的属性和权限怎么办呢? 我们可以使用下面3个命令来修改文件的属性和权限: chgrp(change group):改变文件所属用户组 chown(change owner):改变文件所有者 chmod(change mode):改变文件的权限 那么到底是怎么实现的呢? 例如: [root@localhost 文件]#...原创 2018-04-18 16:27:12 · 763 阅读 · 1 评论 -
关于指针与数组下标加1的问题
我们在学习C语言的时候经常会碰到指针或者数组下标加1,这也是个令大家非常头疼的问题,那就是它加1以后实际上是加了多少,指针或者数组的下标移动到了哪里。 下面我就通过举几个例子来告诉大家答案。 例1:#include <stdio.h>int main(int argc, char **argv){ int a[3]={ 0 }; ...原创 2018-04-09 22:22:08 · 2041 阅读 · 0 评论 -
字符串对比判断
题目说起来很简单,你会读到两个字符串,每个字符串占据一行,每个字符串的长度均小于10000字符,而且第一个字符串的长度小于第二个字符串的。你的程序要找出第一个字符串在第二个字符串中出现的位置,输出这些位置,如果找不到,则输出-1。 注意,第一个字符的位置是0。 注意,第一个字符串在第二个字符串中的位置可能不止一处。 注意,字符串中可能含有空格。 注意,两个字符串的长度一定大于0。 ...原创 2018-03-27 19:02:52 · 450 阅读 · 1 评论 -
关于无符号整数的加法
请看下面这段代码:#include<stdio.h>int main(){ int a=-2; unsigned int b=1; if(a+b>=0) printf("1 "); else printf("0 "); printf("%d ",a+b); printf("%u",a+b);...原创 2018-03-28 16:23:22 · 3446 阅读 · 0 评论 -
蓝桥杯 基础练习 杨辉三角形
问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。 下面给出了杨辉三角形的前4行: 1 1 1 1 2 1 1 3 3 1 给出n,输出它的前n行。输入格式 输入包含一个数n。输出格式 输出杨辉三角形的...原创 2018-03-29 16:34:13 · 1064 阅读 · 0 评论 -
Linux中的文件参数的由来
在讲解Linux文件权限设置前,我们首先来讲解一下怎么查看Linux文件的属性。因为只有知道了文件的属性我们才能去修改它的权限(这样才是有意义的)。 你可以在终端中使用ls -al这个命令查看文件的属性。[root@localhost 0415]# ls -al总计 92drwxr-xr-x 5 root root 4096 04-15 20:41 .drwxr-xr-x 10 ...原创 2018-04-18 00:19:40 · 423 阅读 · 0 评论 -
Linux中的常用命令
vi/vim 文件名:进入vi/vim vi/vim有3个模式:底行模式,命令行模式,插入模式 下面是3种模式的切换 进入vi后是出于命令行模式的,按字母i或者a可以进入插入模式进行编辑文件。 按Esc键进入命令行模式,按:(冒号)进入底行模式。 在插入模式下的常用操作: Ctrl+space:切换到简体中文(打汉字的时候用) shift+space:当你不小心使用全角英文字符时,按...原创 2018-04-18 14:22:31 · 233 阅读 · 0 评论 -
Linux中的EOF
我们经常会看到这样的代码:#include <stdio.h>int main(int argc, char **argv){ int num = 0; while(getchar() != EOF) num++; printf("num = %d\n",num); return 0;}它的功能是统计从输入到文件结...原创 2018-04-06 16:05:51 · 854 阅读 · 0 评论 -
Linux中pts/0的讲解
当我们在vm终端输入who命令时,会出现pts/0那么它是什么意思呢? 首先要知道who命令是用来干嘛的。 who:查看目前有谁在线 pts是所谓的伪终端或虚拟终端,具体表现就是你打开一个终端,这个终端就叫pts/0,如果你再打开一个终端,这个新的终端就叫pts /1。...原创 2018-04-18 15:58:48 · 22068 阅读 · 0 评论 -
用函数来实现字符串的各种操作
int len() { char a[20]; printf(“显示字符串的长度\n”); printf(“请输入一个字符串:”); scanf(“%s”,a); int i=0; while(a[i]!=’\0’) i++; printf(“%d”,i); return 0; }int triple...原创 2018-08-10 16:43:13 · 316 阅读 · 0 评论 -
循环队列的各种操作
#include <stdio.h>#include <stdlib.h>#define LEN sizeof(SqQueue)#define MAXSIZE 10typedef struct { int data[MAXSIZE]; int front; int rear;}SqQueue;SqQueue *Q;void I...原创 2018-08-14 23:23:21 · 244 阅读 · 0 评论 -
给定一个正整数n,求出0到n中有几个数满足其二进制表示不包含连续的1
样例:输入:5 输出:50 01 10 100 101满足,11不满足。那么6144呢?答案是610,怎么去计算呢?思路:查找从0到n中有多少个数包含连续的1,然后在总数中去掉这些情况,得到的就是结果。请看下面求解的代码:#include <stdio.h>int cnt = 0;void fun(int m){ int flag = 0; w...原创 2018-10-23 17:31:23 · 1400 阅读 · 0 评论 -
C语言实现求一个字符串的最长回文字串 动态规划
求解思路:回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串,那么P[i+1,j-1]也是回文字符串。这样最长回文子串就能分解成一系列子问题了。这样需要额外的空间O(N2),算法复杂度也是O(N2)。首先定义状态方程和转移方程:P[i,j]=0表示子串[i,j]不是回文串。P[i,j]=1表示子串[i,j]是回文串。P[i,i]=1P[i,j]{=...原创 2018-10-19 20:42:07 · 2079 阅读 · 0 评论 -
两个单链表的合并(C语言实现)
两个单链表的合并(C语言实现)#include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct Node *PtrToNode;struct Node { ElementType Data; PtrToNode Next;};typedef PtrToNo...转载 2018-09-27 11:56:00 · 9401 阅读 · 0 评论 -
排序之时间复杂度和空间复杂度总结
排序方法 平均时间复杂度 最好 最差 空间复杂度 稳定度 冒泡排序 o(n^2) o(n) o(n^2) o(1) 稳定 选择排序 o(n^2) ...原创 2018-08-21 13:18:10 · 1084 阅读 · 0 评论 -
数据结构——7种排序——示例
#include <stdio.h>#define MAXSIZE 10typedef struct { int r[MAXSIZE]; int length;}SqList;void swap(SqList *L, int i, int j){ int temp = L -> r[i]; L -> r[i] = L -&g...原创 2018-08-21 12:32:06 · 434 阅读 · 0 评论 -
数据结构之二叉树的各种操作
#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#define LEN sizeof(struct BiTNode)typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild;}*BiTree;void InitBiTree(BiTree *T...原创 2018-08-23 10:02:16 · 237 阅读 · 0 评论 -
链栈的各种操作
#include <stdio.h>#include <stdlib.h>#define LEN1 sizeof(StackNode)#define LEN sizeof(LinkStackPtr)typedef struct StackNode{ int data; struct StackNode *next;}StackNode,*Li...原创 2018-08-13 20:53:18 · 257 阅读 · 0 评论 -
C语言普通栈的各种操作
#include <stdio.h>#include <stdlib.h>#define LEN sizeof(SqStack)#define MAXSIZE 10typedef struct { int data[MAXSIZE]; int top;}SqStack;SqStack *S;void InitStack(){ ...原创 2018-08-13 19:44:30 · 299 阅读 · 0 评论 -
C语言共享栈的各种操作
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 10#define LEN sizeof(SqDoubleStack)typedef struct { int data[MAXSIZE]; int top1; int top2;}SqDoubleStack;SqDouble...原创 2018-08-13 19:23:09 · 386 阅读 · 0 评论 -
Linux C采用makefile进行多文件编译时对全局变量的用法
我们刚开始学习makefile进行多文件编译时常常会遇到这样的问题:你想在多文件中定义一个全局变量来实现在不同的文件中,只要该变量的值在其中一个文件改变,其他相应的文件中该变量的值也变成那个值。 但是刚开始常常会遇到问题,主要的问题就是你的全局变量声明和定义的地方不对。 首先要理解这些概念 1.定义需要分配存储空间 2.初始化是定义变量时候赋给变量的值; 3.赋值是以后用到该变量,赋给该...原创 2018-08-08 19:50:25 · 903 阅读 · 0 评论 -
栈的基本操作
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 5#define LEN sizeof(SqStack)typedef struct { int data[MAXSIZE]; int top;}SqStack;SqStack *S;void InitStack(){ ...原创 2018-08-13 11:17:57 · 225 阅读 · 0 评论 -
双向循环链表的创建和删除
#include <stdio.h>#include <stdlib.h>#include <string.h>#define LEN sizeof(Node)typedef struct Node{ char name[10]; struct Node *next; struct Node *prev;}Node,*Li...原创 2018-08-12 23:11:38 · 267 阅读 · 0 评论 -
C语言链队的各种操作
#include <stdio.h>#include <stdlib.h>#define LEN sizeof(Node)#define LEN1 sizeof(LinkQueuePtr)typedef struct Node{ int data; struct Node *next;}Node,*LinkQueue;typedef st...原创 2018-08-15 10:56:46 · 493 阅读 · 0 评论 -
带头结点的链表的各种操作
#include &lt;stdio.h&gt;#include &lt;string.h&gt;#include &lt;stdlib.h&gt;#include &lt;math.h&gt;#include &lt;time.h&gt;#define LEN sizeof(Node)typedef struct Node{原创 2018-08-12 20:21:24 · 282 阅读 · 0 评论