自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 如何让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 191

原创 排序算法

准备工作#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 191

原创 查找算法

顺序查找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 162

原创 算法(2)

查找顺序查找从头到尾逐一比较,对于数据没有要求,但方法简单,在小规模的数据查找中比较常用,但效率低二分查找前提就是数据必须有序,然后从数据的中间位置开始查起(比中间数小往左查,比中间大往右查),如果中间值比key小,则从中间位置开始继续查找,反之从开头到中间位置查找,重复以上过程直到结束从代码实现角度来说,既可以用循环实现,也可以用递归实现块查找,权重查找适用于特殊条件下,需要对数据...

2019-08-25 23:01:44 158

原创 算法(1)

算法数据结构中的算法,指的是数据结构所具备的功能,是解决特定问题的方法,是前辈们的一些优秀的经验总结分治把个大而复杂的问题,分解为很多个小的而简单的问题,利用计算机的强大计算能力来解决问题实现分治的方法循环、递归递归是函数自己调用自己的一种行为,可以形成循环调用,进而实现分治算法什么情况下使用递归:1、问题过于复杂,无法拆解成循环语句2、问题非线性,而函数递归,由于借助栈内存(...

2019-08-25 22:51:51 183

原创

图元素之间存在多对多关系注意:线性表的元素之间存在前驱和后继,树的元素之间存在父子关系,图的任意元素之间都有可能存在关系由顶点的有穷非空集合和顶点之间边的集合组成在图型数据结构中,数据被成为顶点,数据之间的关系被成为边注意:在图中不允许出现没有点,但可以没有边G(V,E):V表示顶点的集合,E表示边的集合各种图的定义无向图顶点与顶点之间没有方向,这种边称为无向边,边用无向序偶对(...

2019-08-25 21:51:00 243

原创 链式二叉树

添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试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 243

原创 顺序二叉树

添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试 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 179

原创 树(2)

树元素之间存储一对多关系的数据结构,常用于表现族谱关系、组织关系等,也可以借助特殊的树型结构实现查找、排序等算法,一般使用倒悬树的方式表示。树的相关术语根结点:树的最上层元素,有且只能有一个。子结点:该结点的对应下一层元素。父结点:该结点的对应上一层元素。叶子结点:没有子结点的元素,一般处于树的最底层。兄弟结点:具有同一个父结点的元素,处在同一层。高度:指的是树的层数。密度:指的...

2019-08-17 16:57:50 224

原创 树(1)

树树是一种元素之间存在一对多关系的数据结构,常用于表示组织结构、辅助排序、查找等,一般以倒悬树的形式显示,根在上支在下。树相关的术语根:树的最顶层的元素,有且仅有一个。双亲:指的是上一层元素。孩子:指的是下一层元素度:"孩子"的数量深度:树的层数密度:树的元素个数结点:一个元素就是一个结点普通树孩子的数量无限制。普通树的顺存储一、对结点的存储顺没有要求二、从上到下从左到...

2019-08-17 16:35:53 174

原创 使用回调,封装一个bsort排序函数,支持任意类型

bsort.hbsort.cmain.c运行结果

2019-08-16 19:24:58 372

原创 通用链表与回调

通用链表(list)void* 万能指针,可以与任意类型的指针互换 int* = void* void* = int* 需要把链表的数据域换成void*类型。回调由于通用链表存储的类型不确定,因此类型的运算规则不确定,当需要使用到关系运算运算时,需要链表的使用者提供运算(提供一个函数供链表调用),这种模式叫回调。void* 不能直接解引用,需要先转换成其它有效类型。...

2019-08-16 19:17:53 214

原创 链式队列

添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试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 147

原创 顺序队列

添加头文件声明宏定义设计数据结构功能函数声明具体功能实现注:因为队头和队尾都指向第一/最后一个有效元素,因此queue->tall指向-1更合适,而不是指向前/下一个空元素,方便查询简单调用测试int main(){ Queue* queue = creat_queue(10); for(int i=0; i<15; i++) { pr...

2019-08-16 17:13:13 143

原创 链式栈

添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试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 132

原创 顺序栈

添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试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 511

原创 链式表

添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试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 410

原创 顺序表

添加头文件声明宏定义设计数据结构功能函数声明具体功能实现简单调用测试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 137

原创

顺序表(存储结构)1、设计数据结构(与结构体相似)2、分析所具备的算法3、实现算法4、使用算法链式表(存储结构)每个元素都独立存储在内存中的任意位置,元素之间有指针指向来维护关系(元素中有一个数据域指针,指向自己类型)。功能受限的表栈(逻辑结构)只有一个数据的控制端(进出同口,先进后出)限制为只有一个端口进出元素,就导致先进后出和特性。 顺序栈(容量有限)链式栈(可以无限...

2019-08-13 19:45:49 158

原创 数据结构简介

什么是数据结构数据结构不是一门研究数据计算的的学科,而是研究数据与数据之间关系的。数据结构的起源:美国高纳德教授,于1968年开设一门《基本算法》的课程,开创的数据结构和算法的先河。提出一个公式:数据结构+算法=程序数据结构的基本概念:数据:能够输入到计算机的描述客观事物的符号。数据项:描述事物的其中一项指标。数据元素:用于描述一个完整的事物。数据结构:由数据元素和元素之间的关...

2019-08-13 19:38:49 189

原创 文件

文本文件与二进制文件:磁盘只能存储二进制数据 int num = 100;文本文件中存储的是ASCII码的二进制,先把数据转换成字符中,再写入到文件中,可以直接被文本编辑器打开 -> ‘1’,‘0’,‘0’ -> 存三个字节二进制文件中存储的是数据的二进制,直接把数据的二进制存储到文件中,无法直接通过文件编辑器查看 -> 都是四字节文件I/O:打开FILE *...

2019-08-12 21:03:19 231

原创 多文件编程

多文件编程当代码过多时如果全写在一个.c文件中就会对代码的编写、阅读、调试造成干扰,为了更方便地管理代码,一般都按照功能模块,把代码拆分成多个.c文件,为每个.c文件编写一个.h文件用于说明.c中有哪些函数、全局变量,然后分别编译每个.c文件(gcc -c code.c),会生成目标文件,然后再把多个目标文件合并成一个可执行文件注意:.c文件最好也包含对应的.h文件,这样可以防止函数的声明与现...

2019-08-12 00:06:30 235

原创 枚举

枚举(enum)注意:命名开头大写!枚举就是一个个列举出来枚举就相当于值受限的int类型,定义枚举就是把这种变量可以等于的值列举出来,用一个标识符表示,除此之外再等于其它值就是非法的(C语言中不检查,为了运行效率,但在C++中会严格检查)枚举值默认从零开始,逐渐加1,也可以指定枚举值可以直接当常量使用(可以使用在case后),可以用有意义的单词代表无意义的数字,可以提高程序的可读性注意...

2019-08-11 23:55:06 457

原创 联合——大小端

联合(union)注意:命名开头大写!它与结构的使用语法基本一样,区别是结构的每个成员都有独立的存储空间,而联合是所有成员共用一块存储空间(每个成员都从0地址开始),因此同一时刻只能有一个成员使用,只要有一个成员的值发生变化,其它成员的值也会随之变化注意:联合的特点就是使用少量的内存对应多个标识符,使用它可以节约内存,在现代的编程中很少使用联合(不再需要极端地节约内存了)相关重点:1、计...

2019-08-11 23:52:40 186

原创 结构

结构(struct)注意:命名开头大写!什么是结构:一种程序员自己设计的数据类型,由若干个不同的数据类型组成,可用于描述一个事物的各项数据设计结构 struct 结构名 { 类型1 成员名1:n; // 可以用n指定成员使用的字节数 类型2 成员名2; 类型3 成员名4; ... };定义结构变量 struct 结构名 结构变量...

2019-08-11 23:46:08 222

原创 预处理指令

在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 328

原创 字符串(1)——相关使用

字符串的输出printf("%s",字符串首地址);优点:自带遇到’\0’就停止的功能puts(字符串首地址);优点:不需要占位符,只需要字符串的首地址,且自动换行putchar( )显示一个字符字符串的输入scanf("%s",内存地址);注意: scanf("%s",arr); -> 不用再取地址(&),数组名本身就是地址了优点:自动添加’\0’缺点:不能输...

2019-08-10 14:59:48 280

原创 字符串(1)——相关定义

字符字符就是符号或图案,在计算机中是以整数形式存储的,当需要显示的时候会根据ASCII码表中的对应关系显示出相关的符号‘\0’ -> 0‘0’ -> 48 (字符0)‘A’ -> 65‘a’ -> 97串一种数据结构,由若干个相同类型的元素组成,有一个明确的结束标志,对串的所有操作都是以这个标志为结束信号字符串由字符组成的串型数据结构,以’\0’作为结束...

2019-08-10 14:03:57 227

原创 内存相关

内存映射当程序运行后,就会有0~4G地址范围(并不能全部访问,地址没有对应物理内存)如果访问了没有映射过的地址(逻辑地址)就会产生段错误当首次使用malloc申请内存时,malloc没有内存可分配,它会向操作系统申请进行内存映射,操作系统会直接映射33页(4096(即4*1024)字节)内存交给管理,当再次使用malloc申请内存时,malloc会把已经有的33页内存进行分配内存管理ma...

2019-08-08 20:57:42 209

原创 堆内存管理

堆内存是代码段当中的其中一段,特点就是大,但不能与标识符建立联系,只能与指针配合使用C语言没有提供管理堆内存的语句,而是标准库提供了一套管理内存的函数函数#include<stdlib.h>void * malloc(size_t size);功能:从堆内存中分配内存参数: size 所申请的字节数,一般使用 sizeof 计算 返回值:所申请的内存的首地址注意: ...

2019-08-07 17:00:22 369

原创 指针(3)

指针的运算指针变量中存储的就是整数,因此整型数据能使用的运算符指针变量基本都能使用,但不是所有的运算都有意义指针进行前后移动指针 + 整数 = 指针 + 宽度 × 整数指针 - 整数 = 指针 - 宽度 × 整数两个指针之间相隔多少个元素指针 - 指针 = (指针 - 指针) / 宽度可以判断两个指针谁在前谁在后指针 关系运算符 指针 (< 、> 、>= 、&lt...

2019-08-05 19:45:02 170

原创 指针(2)——使用指针要注意的问题

空指针指针变量的值等于NULL(NULL可能等于0可能不等于,不同系统下值不同),这种指针叫空指针注意:当操作系统重启时会跳转到NULL地址,进行重启,因此NULL存储操作系统用于重启的数据,因此不能对空指针解引用(不能用空指针访问内存),一定会出现段错误NULL在C语言中是一种错误标志,如果函数的返回值是指针类型,结果一旦NULL表示函数执行出错或失败如何避免空指针造成的错误?使用来历...

2019-08-05 19:28:54 282

原创 指针(1)

什么是指针指针是一种数据类型(里面存储的是整数),使用它可以用来定义变量(与int、long一样),与int、long不同的是它存储整数代表了内存的编号,通过这个变量可以访问对应编号的内存为什么使用指针1、堆内存无法取名字(无法使用标识符与堆内存建立联系),必须配合指针2、函数之间的参数是值传递(内存拷贝),使用指针可以优化参数的传递效率(指针永远传递4字节,无论内容多大)(需要对变量进行...

2019-08-05 19:20:13 154

原创 缓冲区

输入缓冲区通过终端输入的数据会先存入在输入缓冲区中,前面数据输入的数据可能会影响后续数据的输入典型残留垃圾的情况:先输入整数、浮点数据,再输入字符或字符串清理缓冲区的方法:1、 通过正则表达式清理缓冲区scanf("%*[^\n]");scanf("%*c);%:拿数据*:丢数据[^\n]:数据丢到至\n缺点:确定缓冲区中有残留的数据2、 调整缓冲区位置指针(将缓冲区的当前...

2019-08-04 17:51:50 215

原创 修饰变量的关键词

auto定义自动申请内存、释放的变量,不加就代表加注意:局部变量和块变量都默认添加 auto , 全局变量不能加const用来保护数据,变量被修饰后就具有了“只读”属性注意:真正的只读数据被修改会产生段错误,其作用只是保护!不能显式修改,但不代表不能改 例:int main(){ const int num = 10; int* p = (int*)&num; *p...

2019-08-04 17:31:01 289

原创 变量的分类

变量的属性: 存储位置、生命周期、作用域全局变量定义在函数外存储位置:初始化过存储在全局段,未初始化存储在静态数据段,全局变量有默认值(0)生命周期:程序运行前就定义好,程序结束后才会被释放,在程序运行期间不会被释放,比较浪费内存作用域:整个程序的任何位置都可以使用注意:这是共享数据的一种方式,但要尽量少用,以免造成命令冲突局部变量定义在函数内,只属于它所在的函数存储位置:栈,...

2019-08-04 17:02:17 199

原创 程序在内存中的分布情况

一个程序运行后在内存中会划分成不同的内存段(一般为50或60),其中与编程相关有:代码段:二进制指令,只读权限只读段:用来存储常量,一旦被修改就会产生段错误全局段(data):存储全局变量静态数据段(bss):程序运行后这段内存会被清理成零栈:数据先进后出,操作系统自动管理,内存的申请和释放都是自动的堆:数据无规则的堆在一起,由程序员自己管理(手动申请、释放)注: gcc 编译后 ,...

2019-08-04 16:49:30 414

原创 函数的传参

函数之间只能是值传递,变量赋值(内存拷贝)1、调用函数时,调用者与被调函数传参1、函数的形参和实参是相互独立的两个变量// 形参:void func(int num)形参变量属于被调用者// 实参:func(num);实参变量属于调用者它们的名字可以相同,但属于不用的函数2、(void)与()不同(void) 不给参数才能调用() 任何参数都能调用3、 例:#inclu...

2019-08-03 17:36:07 194

原创 数组的越界

编译器不会检查数组的下标,因此使用数组可以越界(且不会有语法错误)越界后果:1、一切正常2、脏数据 int arr[10]; for(int i = 0; i <= 10; i++) { arr[i] = 0; printf("--------%d\n",i); }运行结果: 0~9无限循环原因:定义时给定空间:[0][1][2][3][4][5][6][7][...

2019-08-03 17:24:49 212

原创 函数

函数是C语言管理代码的最小函数,一个函数就是一段具有某项功能的代码标准库函数C语言标准委员会,为C语言提供的一些基础功能,以函数形式体现,常用的库函数有:rand: 获取随机数注意:现阶段计算机中的随机数是伪随机数,是把所有的无符号整数打乱顺序存储在计算机,rand就是从这个序列中获取,而不是计算rand默认从第一个位置开始获取,获取的数据每次都一样srand:设置rand开始获取的位...

2019-08-03 17:20:55 132

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除