重点
無昼
这个作者很懒,什么都没留下…
展开
-
如何让vim编辑器用起来更顺手
如何让vim编辑器用起来更顺手在用户目录下编写一个 .vimrc 文件内容如下:"显示行号set number"不显示行号,正常模式输入:进入行底模式,set nonumber"设置tab键的宽度,默认是8,一般配置为4set tabstop=4"设置缩进的宽度set shiftwidth=4"使用空格代替tab,在Makefile中缩进要使用tabset noexpandt...原创 2019-12-03 21:54:53 · 177 阅读 · 0 评论 -
图
图元素之间存在多对多关系注意:线性表的元素之间存在前驱和后继,树的元素之间存在父子关系,图的任意元素之间都有可能存在关系由顶点的有穷非空集合和顶点之间边的集合组成在图型数据结构中,数据被成为顶点,数据之间的关系被成为边注意:在图中不允许出现没有点,但可以没有边G(V,E):V表示顶点的集合,E表示边的集合各种图的定义无向图顶点与顶点之间没有方向,这种边称为无向边,边用无向序偶对(...原创 2019-08-25 21:51:00 · 229 阅读 · 0 评论 -
算法(1)
算法数据结构中的算法,指的是数据结构所具备的功能,是解决特定问题的方法,是前辈们的一些优秀的经验总结分治把个大而复杂的问题,分解为很多个小的而简单的问题,利用计算机的强大计算能力来解决问题实现分治的方法循环、递归递归是函数自己调用自己的一种行为,可以形成循环调用,进而实现分治算法什么情况下使用递归:1、问题过于复杂,无法拆解成循环语句2、问题非线性,而函数递归,由于借助栈内存(...原创 2019-08-25 22:51:51 · 171 阅读 · 0 评论 -
算法(2)
查找顺序查找从头到尾逐一比较,对于数据没有要求,但方法简单,在小规模的数据查找中比较常用,但效率低二分查找前提就是数据必须有序,然后从数据的中间位置开始查起(比中间数小往左查,比中间大往右查),如果中间值比key小,则从中间位置开始继续查找,反之从开头到中间位置查找,重复以上过程直到结束从代码实现角度来说,既可以用循环实现,也可以用递归实现块查找,权重查找适用于特殊条件下,需要对数据...原创 2019-08-25 23:01:44 · 150 阅读 · 0 评论 -
链式表
添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试int main(){ List* list = creat_list(); for(int i=0; i<10; i++) { tail_add_list(list,i); // 尾添加 head_add_list(list,i); // 头添加 } ...原创 2019-08-16 14:20:23 · 393 阅读 · 0 评论 -
顺序栈
添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试int main(){ Stack* stack = creat_stack(15); // 创建容量为15的栈 printf("开始入栈:"); for(int i=0; i<20; i++) { printf("入栈%s,",push_stack(stack,i)?"成功...原创 2019-08-16 16:37:26 · 497 阅读 · 0 评论 -
文件
文本文件与二进制文件:磁盘只能存储二进制数据 int num = 100;文本文件中存储的是ASCII码的二进制,先把数据转换成字符中,再写入到文件中,可以直接被文本编辑器打开 -> ‘1’,‘0’,‘0’ -> 存三个字节二进制文件中存储的是数据的二进制,直接把数据的二进制存储到文件中,无法直接通过文件编辑器查看 -> 都是四字节文件I/O:打开FILE *...原创 2019-08-12 21:03:19 · 214 阅读 · 0 评论 -
链式栈
添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试int main(){ Stack* stack = creat_stack(); for(int i=0; i<10; i++) { push_stack(stack,i); printf("top:%d\n",*top_stack(stack)); } printf("...原创 2019-08-16 16:49:34 · 123 阅读 · 0 评论 -
顺序队列
添加头文件声明宏定义设计数据结构功能函数声明具体功能实现注:因为队头和队尾都指向第一/最后一个有效元素,因此queue->tall指向-1更合适,而不是指向前/下一个空元素,方便查询简单调用测试int main(){ Queue* queue = creat_queue(10); for(int i=0; i<15; i++) { pr...原创 2019-08-16 17:13:13 · 131 阅读 · 0 评论 -
链式队列
添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试int main(){ Queue* queue = creat_queue(); for(int i=0; i<10; i++) { push_queue(queue,i); printf("队尾:%d\n",*tail_queue(queue)); } printf(...原创 2019-08-16 19:09:31 · 133 阅读 · 0 评论 -
使用回调,封装一个bsort排序函数,支持任意类型
bsort.hbsort.cmain.c运行结果原创 2019-08-16 19:24:58 · 358 阅读 · 0 评论 -
树(2)
树元素之间存储一对多关系的数据结构,常用于表现族谱关系、组织关系等,也可以借助特殊的树型结构实现查找、排序等算法,一般使用倒悬树的方式表示。树的相关术语根结点:树的最上层元素,有且只能有一个。子结点:该结点的对应下一层元素。父结点:该结点的对应上一层元素。叶子结点:没有子结点的元素,一般处于树的最底层。兄弟结点:具有同一个父结点的元素,处在同一层。高度:指的是树的层数。密度:指的...原创 2019-08-17 16:57:50 · 212 阅读 · 0 评论 -
查找算法
顺序查找int order_find(int* arr,size_t len,int key) // 会有非法值,因此不返回无符号;key为要找的值{ for(int i = 0; i < len; i++) { if(arr[i] == key) return i; } return -1;}二叉查找递归算法int _binary_find(int* ar...原创 2019-09-03 09:27:47 · 144 阅读 · 0 评论 -
排序算法
准备工作#define swap(a,b) {typeof(a) t=a;a=b;b=t;}冒泡排序能监测到数据是否有序,一旦监测到有序则停止排序void bubble_sort(int* arr,size_t len){ for(int i = len-1; i > 0; i--) // i为最后一个 { bool flag = true; // 假定已经...原创 2019-09-03 20:57:30 · 176 阅读 · 0 评论 -
链式二叉树
添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试int main(){ Node* tree = NULL; for(int i=0; i<10; i++) { TYPE data = rand() % 100; printf("%d\n",data); add_tree(&tree,data); }...原创 2019-08-20 20:49:49 · 231 阅读 · 0 评论 -
顺序二叉树
添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试 int main() { TYPE arr[] = {1,2,3,4,5,6,7,8}; BinTree* tree = creat_tree(256); init_tree(tree,arr,8); prev_show(tree); ...原创 2019-08-20 19:53:26 · 166 阅读 · 0 评论 -
变量的分类
变量的属性: 存储位置、生命周期、作用域全局变量定义在函数外存储位置:初始化过存储在全局段,未初始化存储在静态数据段,全局变量有默认值(0)生命周期:程序运行前就定义好,程序结束后才会被释放,在程序运行期间不会被释放,比较浪费内存作用域:整个程序的任何位置都可以使用注意:这是共享数据的一种方式,但要尽量少用,以免造成命令冲突局部变量定义在函数内,只属于它所在的函数存储位置:栈,...原创 2019-08-04 17:02:17 · 186 阅读 · 0 评论 -
修饰变量的关键词
auto定义自动申请内存、释放的变量,不加就代表加注意:局部变量和块变量都默认添加 auto , 全局变量不能加const用来保护数据,变量被修饰后就具有了“只读”属性注意:真正的只读数据被修改会产生段错误,其作用只是保护!不能显式修改,但不代表不能改 例:int main(){ const int num = 10; int* p = (int*)# *p...原创 2019-08-04 17:31:01 · 275 阅读 · 0 评论 -
缓冲区
输入缓冲区通过终端输入的数据会先存入在输入缓冲区中,前面数据输入的数据可能会影响后续数据的输入典型残留垃圾的情况:先输入整数、浮点数据,再输入字符或字符串清理缓冲区的方法:1、 通过正则表达式清理缓冲区scanf("%*[^\n]");scanf("%*c);%:拿数据*:丢数据[^\n]:数据丢到至\n缺点:确定缓冲区中有残留的数据2、 调整缓冲区位置指针(将缓冲区的当前...原创 2019-08-04 17:51:50 · 190 阅读 · 0 评论 -
指针(1)
什么是指针指针是一种数据类型(里面存储的是整数),使用它可以用来定义变量(与int、long一样),与int、long不同的是它存储整数代表了内存的编号,通过这个变量可以访问对应编号的内存为什么使用指针1、堆内存无法取名字(无法使用标识符与堆内存建立联系),必须配合指针2、函数之间的参数是值传递(内存拷贝),使用指针可以优化参数的传递效率(指针永远传递4字节,无论内容多大)(需要对变量进行...原创 2019-08-05 19:20:13 · 140 阅读 · 0 评论 -
指针(2)——使用指针要注意的问题
空指针指针变量的值等于NULL(NULL可能等于0可能不等于,不同系统下值不同),这种指针叫空指针注意:当操作系统重启时会跳转到NULL地址,进行重启,因此NULL存储操作系统用于重启的数据,因此不能对空指针解引用(不能用空指针访问内存),一定会出现段错误NULL在C语言中是一种错误标志,如果函数的返回值是指针类型,结果一旦NULL表示函数执行出错或失败如何避免空指针造成的错误?使用来历...原创 2019-08-05 19:28:54 · 265 阅读 · 0 评论 -
指针(3)
指针的运算指针变量中存储的就是整数,因此整型数据能使用的运算符指针变量基本都能使用,但不是所有的运算都有意义指针进行前后移动指针 + 整数 = 指针 + 宽度 × 整数指针 - 整数 = 指针 - 宽度 × 整数两个指针之间相隔多少个元素指针 - 指针 = (指针 - 指针) / 宽度可以判断两个指针谁在前谁在后指针 关系运算符 指针 (< 、> 、>= 、<...原创 2019-08-05 19:45:02 · 155 阅读 · 0 评论 -
堆内存管理
堆内存是代码段当中的其中一段,特点就是大,但不能与标识符建立联系,只能与指针配合使用C语言没有提供管理堆内存的语句,而是标准库提供了一套管理内存的函数函数#include<stdlib.h>void * malloc(size_t size);功能:从堆内存中分配内存参数: size 所申请的字节数,一般使用 sizeof 计算 返回值:所申请的内存的首地址注意: ...原创 2019-08-07 17:00:22 · 347 阅读 · 0 评论 -
字符串(1)——相关定义
字符字符就是符号或图案,在计算机中是以整数形式存储的,当需要显示的时候会根据ASCII码表中的对应关系显示出相关的符号‘\0’ -> 0‘0’ -> 48 (字符0)‘A’ -> 65‘a’ -> 97串一种数据结构,由若干个相同类型的元素组成,有一个明确的结束标志,对串的所有操作都是以这个标志为结束信号字符串由字符组成的串型数据结构,以’\0’作为结束...原创 2019-08-10 14:03:57 · 204 阅读 · 0 评论 -
字符串(1)——相关使用
字符串的输出printf("%s",字符串首地址);优点:自带遇到’\0’就停止的功能puts(字符串首地址);优点:不需要占位符,只需要字符串的首地址,且自动换行putchar( )显示一个字符字符串的输入scanf("%s",内存地址);注意: scanf("%s",arr); -> 不用再取地址(&),数组名本身就是地址了优点:自动添加’\0’缺点:不能输...原创 2019-08-10 14:59:48 · 263 阅读 · 0 评论 -
顺序表
添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试int main(){ // 创建 Array* arr = create_array(20); // 存数 for(int i=0; i<100; i++) { TYPE* p = access_array(arr,i); if(NULL != p) { ...原创 2019-08-14 20:23:08 · 128 阅读 · 0 评论 -
预处理指令
在C语言中以#开头的语句都叫做预处理指令,因为这些不是标准的C代码,不能被编译器直接编译,需要一段程序把它翻译成标准的C代码,负责翻译的程序叫预处理器,翻译的过程叫预处理。gcc -E code.c 把预处理的结果显示在终端上gcc -E code.c -o code.i 把预处理的结果存储到文件中(-o :重命名,为执行/编译的结果重新取名)例:gcc hello.c -o hell...原创 2019-08-11 17:10:38 · 314 阅读 · 0 评论 -
联合——大小端
联合(union)注意:命名开头大写!它与结构的使用语法基本一样,区别是结构的每个成员都有独立的存储空间,而联合是所有成员共用一块存储空间(每个成员都从0地址开始),因此同一时刻只能有一个成员使用,只要有一个成员的值发生变化,其它成员的值也会随之变化注意:联合的特点就是使用少量的内存对应多个标识符,使用它可以节约内存,在现代的编程中很少使用联合(不再需要极端地节约内存了)相关重点:1、计...原创 2019-08-11 23:52:40 · 170 阅读 · 0 评论 -
多文件编程
多文件编程当代码过多时如果全写在一个.c文件中就会对代码的编写、阅读、调试造成干扰,为了更方便地管理代码,一般都按照功能模块,把代码拆分成多个.c文件,为每个.c文件编写一个.h文件用于说明.c中有哪些函数、全局变量,然后分别编译每个.c文件(gcc -c code.c),会生成目标文件,然后再把多个目标文件合并成一个可执行文件注意:.c文件最好也包含对应的.h文件,这样可以防止函数的声明与现...原创 2019-08-12 00:06:30 · 213 阅读 · 0 评论 -
程序在内存中的分布情况
一个程序运行后在内存中会划分成不同的内存段(一般为50或60),其中与编程相关有:代码段:二进制指令,只读权限只读段:用来存储常量,一旦被修改就会产生段错误全局段(data):存储全局变量静态数据段(bss):程序运行后这段内存会被清理成零栈:数据先进后出,操作系统自动管理,内存的申请和释放都是自动的堆:数据无规则的堆在一起,由程序员自己管理(手动申请、释放)注: gcc 编译后 ,...原创 2019-08-04 16:49:30 · 398 阅读 · 0 评论