C语言
文章平均质量分 81
C语言相关的博客, 有语法有数据结构
暴走的橙子~
这个作者很懒,什么都没留下…
展开
-
C语言实现二叉树(初阶数据结构)
树的概念及结构树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点。除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i<= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继因此,树是递归定义的。 ...原创 2022-01-01 22:47:29 · 3577 阅读 · 11 评论 -
设计循环队列 - OJ题
目录题目描述示例提示题目分析结构体的创建函数接口的创建MyCircularQueue* myCircularQueueCreate(int k)bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)bool myCircularQueueDeQueue(MyCircularQueue* obj)int myCircularQueueFront(MyCircularQueue* obj)int my.原创 2021-11-03 21:54:03 · 474 阅读 · 2 评论 -
栈的模拟实现(顺序表来模拟)
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。 栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。目录栈的结构体创建函数接口的创建void Stack...原创 2021-11-02 16:45:35 · 428 阅读 · 0 评论 -
函数栈帧的创建与销毁
寄存器在讲函数栈帧之前先来补充一下知识~eax、ebx、ecx、edxebp、esp 这两个寄存器中放的是地址,这两个地址是用来维护函数栈帧的。函数调用前的准备在VS2013中,main函数也是被其他韩数调用的:mainCRTStartup->_tmainCRTStartup->main。mainCRTStartup先调用_tmainCRTStartup,再通过_tmainCRTStartup调用main函数进行栈上空间的开辟。注意:每一次函数调用,都.原创 2021-08-09 17:32:40 · 118 阅读 · 0 评论 -
队列的模拟实现(单链链表模拟)
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出,后进后出特特点。队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 。出队列:进行删除操作的一端称为队头。目录队列的结构体创建队列的函数接口void QueueInit(Queue* q)void QueuePush(Qu..原创 2021-11-02 17:50:10 · 554 阅读 · 0 评论 -
常见排序算法激烈讲解
排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。在这里主原创 2021-11-21 21:24:28 · 1271 阅读 · 4 评论 -
两个队列模拟栈-OJ题
目录题目描述示例提示题目分析结构体的创建函数接口void myStackPush(MyStack* obj, int x)int myStackPop(MyStack* obj)int myStackTop(MyStack* obj)bool myStackEmpty(MyStack* obj)void myStackFree(MyStack* obj)完整代码题目描述请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种..原创 2021-11-03 17:19:57 · 432 阅读 · 0 评论 -
结构体初阶认识
结构体结构体类型的声明结构体的初始化结构体成员访问结构体传参结构体基础知识结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构体类型的声明对一本书的描述:struct Book是结构体类型struct Book{ char name[20]; //书名 char author[20]; //作者 float price;//价格};//分号不能丢注意:结构体的成员类型可以是标量、数组、指针、其他结构体。结构体的定原创 2021-08-05 19:40:43 · 358 阅读 · 2 评论 -
C语言动态内存管理
目录为什么存在动态内存分配动态内存函数的介绍malloc、freecallocrealloc常见的动态内存错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释放(内存泄漏)C/C++程序的内存开辟柔性数组柔型数组的特点柔性数组的使用柔性数组的优势为什么存在动态内存分配我们已经掌握的内存开辟方式有:int a=原创 2021-10-01 15:43:45 · 259 阅读 · 3 评论 -
自定义结构类型:结构体、枚举、联合
结构体结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。它可以用来描述复杂对象。 比如:当描述一个学生的基本情况,c语言里提供的(int、char、double.....)类型无法满足描述这种复杂类型,所以结构体就可以很好来解决这类情况。结构的声明struct stu{ char name[20];//姓名 char sex[5];//性别 int age;//年龄 char id[20];//学号};//分号不能丢 ch...原创 2021-09-29 08:19:23 · 497 阅读 · 7 评论 -
C语言预处理
程序的翻译环境和执行条件在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。翻译环境1、组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。2、每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。3、链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程原创 2021-10-16 17:33:04 · 2439 阅读 · 2 评论 -
C语言关于整形提升的那些事
隐式类型转换C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。整型提升的意义 表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度,一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。 通用CPU(general-...原创 2021-08-04 16:26:15 · 302 阅读 · 1 评论 -
关于动态内存开辟的几个经典面试题
题目1运行会有什么样的结果?#include<stdio.h>#include<stdlib.h>#include<string.h>void GetMemory(char* p){ p = (char*)malloc(100);}void Test(void){ char* str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str);}int main()原创 2021-10-01 16:44:12 · 158 阅读 · 0 评论 -
两个栈模拟队列
目录题目描述题目解析总结:结构体初始化函数接口MyQueue* myQueueCreate()void myQueuePush(MyQueue* obj, int x)int myQueuePop(MyQueue* obj)int myQueuePeek(MyQueue* obj)bool myQueueEmpty(MyQueue* obj)void myQueueFree(MyQueue* obj)完整代码题目描述请你仅使用两个栈实现先入先出队列.原创 2021-11-03 18:24:01 · 1080 阅读 · 0 评论 -
浮点型数据存储和整型数据存储区别的那点事
话不多说,首先来看下面的代码,你觉得下面的代码结果是什么样的呢?#include<stdio.h>int main(){ int n = 9; float* p = (float*)&n; //把n的地址存储到了指针p中 printf("n的值为:%d\n", n); printf("*p的值为:%f\n", *p); *p = 9.0; printf("n的值为:%d\n", n); ...原创 2021-08-16 10:51:33 · 1226 阅读 · 3 评论 -
单链表的实现
无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。 这种链表每一个节点存一个数据,以及下一个节点的地址,这样可以很好地把每个节点串起来。单链表是针对顺序表缺点来创建的。目录结构体的创建函数接口的实现void SLTNodeDestroy(SLTNode** pphead)SLTNode* BuyListNode(SLTDataType x)...原创 2021-10-30 18:37:20 · 304 阅读 · 0 评论 -
字符串+内存函数使用及模拟实现
目录strlenstrlen模拟实现strcpystrcpy模拟实现strcatstrcat模拟实现strcmpstrcmp的模拟实现以上字符函数的优化版strncpy strncatstrncmpstrstrstrstr模拟实现内存函数memcpymemcpy模拟实现memmovememmove模拟实现memcmpstrtokstrlen头文件:#include<string...原创 2021-09-24 09:23:57 · 133 阅读 · 2 评论 -
双向链表的实现
带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。这种链表是针对单向链表缺点来设计的。目录结构体的创建双向链表函数接口定义函数接口的实现LTNode* ListInit()void ListDestroy(struct ListNode* phead)LTNode* BuyListNode(LT...原创 2021-10-30 22:06:47 · 946 阅读 · 0 评论 -
动态版顺序表的实现
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。目录首先,我们先定义变量,创建结构体。顺序表接口的创建void SeqListInit(SL* ps)void SeqListDestroy(SL* ps)void SeqListCheckCapacity(SL* ps)void SeqListPushBack(SL* ps, SLDataType x)void SeqListPopBa...原创 2021-10-30 11:58:43 · 436 阅读 · 0 评论 -
C语言文件操作
什么是文件磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。我们没有学习文件操作之前,大部分见过所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。其实有时候我们会.原创 2021-10-02 16:56:36 · 248 阅读 · 0 评论 -
计算器三种版本的实现
学习了函数指针、函数数组指针以后我们可以实际应用一下,接下来就介绍三种计算器模拟实现的不同的版本。普通版本实现#include<stdio.h>void menu(){ printf("**********************************\n"); printf("**** 1.add 2.sub ******\n"); printf("**** 3.mul 4.div ******\n"); ...原创 2021-09-28 15:40:31 · 132 阅读 · 0 评论 -
C语言操作符
操作符的分类算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用、函数调用和结构成员算术操作符+ - * / %注意事项:1、除了%操作符外,其他几个操作符都可用于整数和浮点数的计算2、/操作符,如果对整数进行运算,执行的是整数除法(得到的一定是整数);如果对浮点数进行运算,执行的是浮点数除法。详细例子如下: 从上面可以看出,5/2 和 5/...原创 2021-07-30 22:19:13 · 306 阅读 · 1 评论 -
我是正在走向编程大佬的蜡笔小白~
自我介绍: 大家好, 我是一位来自河南的大学生,我的专业是电气工程及其自动化。这是我第一次学着写博客,我也很开心和大家一起分享我对编程的看法。我的专业略有涉及c语言知识的学习,后来慢慢发现c语言很合我的胃口。慢慢走上了一发不可收拾的学c语言的旅途。学习编程的目标: 或许是有对程序员高薪生活向往,当然,这也是很多人的想法。追求美好的梦想是一件美好的事情,我们不仅要仰望星空,还要脚踏实地。给自己制定一个学习目标。时刻明白自己是一个什么样的水准、自己的努力是真心真意的吗?我现在的...原创 2021-06-04 10:10:14 · 907 阅读 · 8 评论 -
C语言实现扫雷小游戏
扫雷小游戏介绍: 《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。游戏实现思路:1、初始化棋盘void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);2、显示棋盘void Display...原创 2021-07-28 21:59:51 · 215 阅读 · 2 评论 -
C语言实现三子棋小游戏
游戏介绍:三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。 那我们如何实现这个游戏呢?我们首先要捋清楚我们要实现什么:1、先初始化棋盘,把未打印的数字置为空格。void InitBoard(char board[ROW][COL], int row, int col);...原创 2021-07-27 22:02:28 · 480 阅读 · 3 评论 -
C语言关于缓冲区的问题
先来介绍getchar这个函数的用法://getchar - 函数 - 从键盘读取字符的#include<stdio.h>int main(){ int ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } return 0;}可以看到运行结果:输入和输出是一致的。细心的你发现问题了吗?第一次输入‘A’时,打印‘A’...原创 2021-08-02 21:58:10 · 382 阅读 · 3 评论 -
快速走遍C(语言)世界
准备好了吗?马上上船驶向C语言世界。原创 2021-06-28 14:45:36 · 252 阅读 · 0 评论 -
两个整数的最小公倍数和最大公约数之和
定义:最小公倍数:能够同时整除两个整数的最小整数。最大公约数:能够同时被两个整数整除最大整数。最直接算法#include<stdio.h>int main(){ int n = 0; int m = 0; printf("请输入两个整数:"); scanf("%d%d", &n, &m); int x = m > n ? m : n; //m和n中大的那一个 int y = m > n ? n : m; //m和n中小的那一个.原创 2021-07-31 22:15:22 · 324 阅读 · 0 评论