![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C语言
文章平均质量分 86
分享一些关于C语言的知识
有效的放假者
这个作者很懒,什么都没留下…
展开
-
(C语言)数据结构——排序算法总结与比较
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。有些排序算法无论如何都不能保证它是稳定的,那么它就是不稳定的但有些排序算法我们加以控制就可以保证他是稳定的,那么它就是稳定的第一次最坏移动一次元素,第二次最坏移动两次元素,以此类推,第n次最坏移动n次元素,所以计算公式为$(1+n)*n/2$近似等于O($n^原创 2022-09-22 17:13:02 · 706 阅读 · 2 评论 -
(C语言)数据结构——归并排序
我们先创建一个和a大小相同的数组,因为有数组a和个数n是不够的,所以创建一个_MergeSort()作为MergeSort()的一个子函数来控制开头(begin)和结尾(end),先取中间值坐标,若中间值坐标的左右两个数组都有序,那么取两个数组中小的尾插,最后再拷贝回原数组==归并哪部分就拷贝哪部分回去==。我们发现递归在这里非常神奇!归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用==分治法==的一个非常典型的应用。将==已有序==的子序列合并,得到完全有序的序列;即先使每个子序列有序原创 2022-09-15 21:03:34 · 613 阅读 · 0 评论 -
(C语言)数据结构——直接选择排序和堆排序
让堆顶先与下标为n-1的元素交换,交换完再进行向下调整;让堆顶再与下标为n-2的元素交换,交换完再进行向下调整;让堆顶再与下标为n-3的元素交换,交换完再进行向下调整,就这个过程循环往复,直到把下标为1的元素和下标为0的元素交换完成之后停止,堆排序就排好了。堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。3. 空间复杂度:O(1)原创 2022-08-19 13:23:59 · 453 阅读 · 19 评论 -
(C语言)数据结构——冒泡排序和快速排序(超详解)
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。冒泡排序(Bubble Sort)是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。一趟冒泡排序就可以把一个最大或者最小的挑出来,走访数列的工作是重复地进行直到没有原创 2022-08-19 13:22:35 · 2709 阅读 · 14 评论 -
数据结构——直接插入排序和希尔排序(超详解)
希尔排序法的基本思想是:先选定一个整数(如下图gap为3)我们就设这个整数为gap,把待排序文件中所有记录分成gap个组,所有==距离为gap==的元素分在同一组内,并==对每一组内的元素进行排序==。然后再取下一组重复排序的工作。然后缩小gap,当gap到达为1时,所有记录在统一组内的数据就排好序了。希尔排序是对直接插入排序的优化。2.当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。3.希尔排序的时间复原创 2022-08-17 17:32:41 · 1762 阅读 · 7 评论 -
(C语言)数据结构之二叉树
节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6**> **2、叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点** 3、非终端节> **5、孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是$2^k-1$ ,则它就是满二叉树。2. 完全二叉树:完全二叉树是效率很高的数据结构原创 2022-08-16 17:04:17 · 552 阅读 · 2 评论 -
(C语言)二叉树经典oj题练习
我们先自己定义一个二叉树结构体类型,然后基于分治的思想,递归构建二叉树,构建二叉树先malloc出根节点然后再构建左子树,右子树即可。因为字符串需要构建之后指针向后移动找到下一个字符,所以需要定义一个i下标,通过传址调用把i的地址传过去,实现对下标i的控制。构建之后i下标向后移动,指针指向’#‘代表到了空节点了完成返回NULL即可。如果一个树的左子树与右子树镜像对称,那么这个树是对称的。> 因此,如果同时满足下面的条件,两个树互为镜像: > 1、它们的两个根结点具有相同的值 > 2、每个树的右子树都与原创 2022-08-16 16:57:59 · 688 阅读 · 0 评论 -
(C语言)程序环境和预处理
_FILE__//进行编译的源文件__LINE__//文件当前的行号__DATE__//文件被编译的日期__TIME__//文件被编译的时间__STDC__//如果编译器遵循ANSIC,其值为1,否则未定义这些预定义符号都是语言内置的。举个例子下面的代码是往文件里写一些日志的操作,注意不同的预定义符号对应的C语言格式字符是不一样的i......原创 2022-07-23 22:46:49 · 257 阅读 · 0 评论 -
(C语言)文件操作
1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭基本打开和关闭操作3.3.运用文件操作函数的例子3.3.1(fputc)写一个字符到文件里3.3.2(fgetc)读取文件里的一个字符3.3.3(fputs)写一行数据到文件里3.3.4(fgets)读取文件里的一行数据3.3.5(fscanf)把文件里的数据按格式输入到程序中3.3.6(fprintf)把数据按格式写入到文件中3.3原创 2022-07-22 21:31:08 · 255 阅读 · 1 评论 -
(C语言)动态内存管理
首先malloc和free都声明在stdlib.h头文件中。这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查.size是你要申请的字节的个数返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己进行强制类型转换为自己所需要的指针类型如果参数size为0,malloc的行为是标准是未定义的,取决于编译器。............原创 2022-07-19 11:42:42 · 363 阅读 · 1 评论 -
(C语言)自定义类型——结构体+枚举+联合
1 结构体的声明1.1 结构的基础知识1.2 结构的声明1.3 特殊的声明1.4 结构的自引用1.5 结构体变量的定义和初始化1.6 结构体内存对齐1.7 修改默认对齐数百度笔试题:1.8 结构体传参2. 位段2.1 什么是位段2.2 位段的内存分配2.3 位段的跨平台问题3.枚举3.1 枚举类型的定义3.2 枚举的优点3.3 枚举的使用4.联合(共用体)4.1 联合类型的定义4.2 联合的特点(面试题)判断当前计算机的大小端存储4.3 联合大小的计算原创 2022-07-17 22:17:58 · 506 阅读 · 1 评论 -
(C语言)字符函数和字符串函数
size_t字符串已经‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包含‘\0’)。参数指向的字符串必须要以‘\0’结束。注意函数的返回值为size_t,是无符号的(易错)strlen函数的模拟实现//计数器方式intmy_strlen(constchar*str){count++;str++;}//不能创建临时变量计数器intmy_strlen(constchar*str){}.........原创 2022-07-17 12:28:22 · 290 阅读 · 0 评论 -
(C语言)指针和数组笔试题解析
的那个值就是逗号表达式的值,以此类推。最后赋进去的值其实是1,3,5,0,0,0。a[0]是第一行的数组名,数组名没有单独放在sizeof’内部,也没有&数组名,那么数组名就是首元素的地址,也就是元素a[0][0]的地址,p是个整形指针,p[0]相当于*(p+0),所以最后输出1....原创 2022-07-16 11:09:11 · 405 阅读 · 0 评论 -
(C语言)qsort函数解读
通过一段代码来介绍inta=10;//int*,编译器会报警告//编译器不会报警告//void*是无具体类型的指针,可以接受任意类型的地址//void*是无具体类型的指针,所以不能解引用操作,也不能±整数return0;}qsort这个函数可以排序任意类型的数据首先使用人家的函数,就要引头文件#include其次,明白每一个函数参数的意义这里的compare函数(简化为cmp)需要写成什么样的?下面是函数的格式。......原创 2022-07-15 20:49:24 · 118 阅读 · 0 评论 -
(C语言)指针的进阶
数组指针是指针?还是数组?答案是指针。我们已经熟悉整形指针是指向整形数据的指针。浮点型指针是指向浮点型数据的指针。那数组指针应该是指向数组的指针。解释p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。这里要注意[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。而且类比inta,a的类型是int,那么这里int(*p)[10]的类型就是。.........原创 2022-07-15 15:42:44 · 122 阅读 · 0 评论 -
(C语言)如何求一个字符串的长度?
今天来分享一下求字符串长度的三种方法。原创 2022-07-14 10:59:18 · 1657 阅读 · 0 评论 -
(C语言)指针详解
指针理解的2个要点:1.指针是内存中一个最小单元的编号,也就是地址2.平时口语中说的指针,通常指的是指针变量,指针变量是一个变量,是用来存放地址的一个变量总结:指针就是地址,口语中说的指针通常指的是指针变量。(指针变量里边存放的是地址,通过这个地址,就可以找到一个内存单元。)我们可以这样理解:指针变量我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量。指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。那这里的问题是:一个小的原创 2022-07-13 20:39:05 · 225 阅读 · 0 评论 -
(C语言)数据的存储(超详解)
char (占1个字节,字符的本质是ASCII码值,是整形,所以把它归到整形家族)short (占2个字节)int (占4个字节)long (占4/8个字节,在32位的平台上是4个字节,在64位平台上是8个字节)解释:unsigned是无符号的,例如生活中的体重、身高,这些数据是没有负数的。大小端字节序整形在内存中的存储浮点型在内存中的存储.....................原创 2022-07-05 11:17:10 · 3123 阅读 · 3 评论 -
有意思的程序死循环
我们先来看一段程序,你认为下面的程序运行结果是怎样的呢?是输出十二个hello?还是死循环输出hello?#include <stdio.h>int main(){ int i = 0; int arr[] = {1,2,3,4,5,6,7,8,9,10}; for(i=0; i<=12; i++) { arr[i] = 0; printf("hello\n"); } return 0;}正确答原创 2022-05-21 18:41:29 · 300 阅读 · 0 评论 -
(C语言)扫雷游戏的简单实现
扫雷想必大家都玩过吧?童年的回忆呀这可都是,记得小时候有一台电脑玩扫雷的家庭就非常不错了,接下来咱们直接进入主题。原创 2022-05-14 17:57:32 · 699 阅读 · 0 评论 -
(C语言)三子棋的实现
如何实现三子棋?基本思路:1、测试游戏的逻辑2、游戏代码的实现3、游戏代码的声明(函数声明,符号定义)原创 2022-05-05 13:23:57 · 1327 阅读 · 0 评论 -
(C语言)判断是不是字母问题,(getchar putchar的使用)
题目描述KiKi想判断输入的字符是不是字母,请帮他编程实现输入描述:多组输入,每一行输入一个字符。输出描述:针对每组输入,输出单独占一行,判断输入字符是否为字母,输出内容详见输出样例。示例1输入:A6输出:A is an alphabet.6 is not an alphabet.我的方法:```c#include<stdio.h>int main() { char str = 'a'; while (scanf("%d", &am原创 2022-05-03 12:47:21 · 901 阅读 · 1 评论