【4.0】C-循环结构及其应用
前言对于大规模的数据,尤其是相互之间存在一定的联系的数据,怎么表示和组织才能达到高效呢?C语言的数组类型为同类型的数据组织提供了一种有效的形式。
同样的,字符串应用广泛,但C语言中没有专门的字符串类型,字符串是使用字符数组来存放的。
一维数组一维数组的定义和引用一维数组的定义在C语言中使用数组前必须先进行定义。一维数组的定义如下:
1234//格式声明类型声明符 数组名[常量表达式];//代码示例int c[10];
其中:
类型声明符是任一种基本数据类型或者构造数据类型,即int,float,char等基本数据类型,以及结构体数据类型。从这里可以看出,数组是建立在其他数据类型的基础之上的,因此数组是构造类型。
数组名是用户定义的数组标识符,命名规则遵循标识符命名规则。对于数组元素来说,它们具有一个共同的名字,即数组名。
需要注意的是,数组的名称不可以与其他变量名相同
方括号中的常量表达式表示数组元素的个数,也成为数组的长度。
不能在方括号中用变量来表示数组元素的个数,但可以使用符号常数或者常量表达式
一维数组元素的存储每个数组元素都占用内存中的一个存储单元,每个元 ...
【4.0】C-循环结构及其应用
前言循环是程序的一种基本结构,它可以解决很多有用的问题,特别是那些重复性有规律的事情。
while循环语句while循环语句的语法格式如下:
123while(表达式){ 语句系列; //循环体}
while语句的执行过程是:根据表达式判断,如果为真,则执行循环体,一直执行循环体,直到break;才会跳出循环。
需要注意的是,while是在循环前,先判断
【实例】求 $n!$。
【代码示例1】
123456789101112131415161718192021222324252627#include <stdio.h>int main(){ int n; long int sum; printf("请输入要求的阶乘:"); scanf("%d", &n); sum = n; if (n>=0) { if (n>0) { while (n>1) ...
【3.0】C-选择结构及其应用
前言这部分东西不多,相对简单,快速上手,通俗易懂。
关系运算符和关系表达式关系运算符在程序中经常需要比较两个量的大小关系,以决定程序的下一步进行的工作。比较两个量的运算符称为关系运算符。通俗来讲,也就是比较运算,即将两个操作数比较并产生运算结构0(假)或1(真)。C语言提供的关系运算符有6种,例如:
运算符
功能
<
小于
<=
小于或等于
>
大于
>=
大于或等于
==
等于
!=
不等于
说明:
C语言中的关系运算符与数学中的(>,>=等)不一样。
以上6种关系运算符中,前4种(<,<=,>,>=)的优先级相同,后两种(==,!=)的优先级相同,前4种优先级高于后两种。
关系运算符的结合性为从左到右。
关系表达式关系表达式是指用关系运算符将两个数(或者表达式)连接起来进行关系运算的式子,代码示例:
1233<2;a>b;a<a+b;
关系表达式的结果是逻 ...
【7.1】查找
前言查找表:是一种数据集合(记录),可以理解为你要从哪里查找
查找表可以分为静态查找表和动态查找表
静态查找:只需要执行查找操作
动态查找:除了查找之外还需要增/删除数据元素
顺序查找顺序查找是我们最开始,也是最熟悉的查找方式,就是一个一个查找(遍历)。
常规顺序查找又称“线性查找”,通常用于线性表。其查找模式是线性的。代码示例:
1234567891011121314151617181920#define ElemType int#define MaxSize 10typedef struct sTable{ ElemType a[MaxSize]; int TableLen;}STable;//顺序查找int Serach_Seq(STable s,ElemType data) { for (int i = 0; i < s.TableLen; i++) { if (data == s.a[i]) { printf("下标为:%d", i); return i; } & ...
【8.1】排序
前言数据结构的最后一部分了,排序也是在前面的数据结构的基础上来解决实际问题的。
排序排序算法可以根据数据量的大小分为:
内部排序:数据都在内存中
外部排序:数据太多,无法全部存放在内存中
关于下述的各种排序算法是基于如下的方法结构来实现的:
123456789101112131415161718192021222324252627282930313233343536373839404142#include <stdio.h>#include <stdbool.h>#define _CRT_SECURE_NO_WARNINGS#define ElemType int //存放的数据类型#define MaxSize 10 //最大数组容量//定义了新的List类型typedef struct list { ElemType data[MaxSize]; //数据数组 int num; //数组的实际大小,即实际存放数据数量}List;//遍历输出Listvoid PrintList(List l) { printf("L ...
【6.1】图
前言图比较复杂,涉及的算法相对较多。
图的定义图,就是例如下图的东西,图可以分为
有向图:即带有明确的方向指向的图,可以使用 $<a,c>$ 表示从 A 到 C 顶点的路径
无向图:不带有明确的方向指向的图,可以使用 $(a,c)$ 表示从 A 到 C 顶点的路径
图注:有向图
图注:无向图
对于图来说,要求边的两端必须存在“顶点”,否则它不是图。同样的,对于图来说,也不存在空图的概念。
从图的结构来说,又可以分为:简单图和多重图。
简单图
不存在重复边
不存在顶点到自身的边
多重图
允许重复边
允许存在顶点到自身的边
图的基本概念
图的阶:图里面的顶点(或者叫结点)个数
顶点的度
无向图:顶点的边数
有向图:入度 + 出度
出度:从顶点指向外面顶点的边
入度:指向顶点的边
路径:两个顶点之间的顶点序列,例如下图:A 到 B 的路径为:A,C,B
回路:第一个顶点和最后一个顶点相同的路径
简单路径:在路径序列中,顶点不重复出现的路径
简单回路:除了第一个顶点和最后一个顶点外,其余顶点不出现重复的回路
路径长度:路径上边的 ...
关于C语言的一些零碎思考
前言在使用C的时候难免会碰到一些奇怪的用法或者令人困惑的语法等等,考虑到问题过于琐碎,就写于这个合集中,名为关于C语言的零碎思考
typedef 和 define 的区别这种关键字的使用常见于对于某种类型的替换,例如下面的场景:
123#define ElemType inttypedef int NewType
两者的区别在于:define是一种宏定义,本质上来说就是字符串替换,而typedef是一种类型封装。
例如参考下面的代码,思考各个变量的类型:
12345#define ElemType int*int main(){ ElemType a,b; }
其中变量a的类型为int*,而变量b的类型为int类型,不难理解宏定义只是字符串替换。
12345typedef int* ElemTypeint main(){ ElemType a,b;}
其中**变量a和变量b的类型均为int***,可以理解为typedef将int*封装成了一个新的类型。
typedef 和 struct 的使用关于结构体的相关基础内容我已经在这篇 ...
【3.1】栈和队列
前言栈和队列是线性表的另一种变形,它拥有一些各自的特点。
如下所有代码需要做如下引用:
123456#include <stdio.h>#include <stdbool.h>#include <malloc.h>//如果你使用的是Visual Studio,则还需要添加如下一条引用#define _CRT_SECURE_NO_WARNINGS
关于上述引用的说明,原因参考关于C语言的一些零碎思考
栈栈的基本概念栈的定义栈(Stack)本质来说还是一种线性表,栈是只允许在一端进行插入或者删除操作的线性表。
空栈:栈中不存储任何数据
栈顶:栈的最顶端
栈底:栈的最低端
栈的特点:后进先出(Last In First Out,LIFO)
栈的基本操作
操作
说明
InitStack()
初始化栈。创造一个空栈,分配内存空间
DestoryStack()
销毁栈。销毁并释放栈所占的内存空间
Push()
进栈。如果栈未满,则将新元素压入栈顶
Pop()
出栈。如果栈不是空栈,则将栈顶元素弹出栈
GetTop()
读取 ...
【4.1】串
前言由于计算机的发展,人们发现对于非数值类型的处理越来越多,进而衍生出来串。
串也就是我们所使用的字符串。
如下所有代码需要做如下引用:
123456#include <stdio.h>#include <stdbool.h>#include <string.h>//如果你使用的是Visual Studio,则还需要添加如下一条引用#define _CRT_SECURE_NO_WARNINGS
关于上述引用的说明,原因参考关于C语言的一些零碎思考
串的定义和基本操作串的定义串,即字符串(String)是由零个或者多个字符组成的有限序列,一般记作S='a1,a2,...an'($n \geqslant 0 $)。
其中S是串的名称,单引号括起来的字符序列是串的值,其中串字符的个数称为串的长度。当 $n =0$ 的时候称为空串。代码示例:
1S = "Hello,World"
子串:串中任意连续个字符组成的子序列,例如:上面的子串Hello。
串的数据对象限定为:字符集(如中文字符,英文字符)。
串的 ...
【5.1】树与二叉树
前言树的基本概念树的定义树是一种数据结构,它和我们现实生活中的树非常类似,其存在一个根节点,向下分裂,产生分支节点,如此,形成了如下图所示的“树”:
图片来源王道《数据结构》
当然,存在一种特殊的树——空树,也就是结点树为 0 的树。
非空树的特性:
有且仅有一个根节点
没有后继的结点称为“叶子结点”(终端结点)
有后继的结点称为“分支节点”(非终端结点)
结点之间的关系描述
祖先结点:在当前指定结点前驱到根节点路径上的所有结点(即上层)
子孙结点:指定结点下面的所有结点
双亲结点:指定结点的前驱结点
孩子结点:指定结点的直接后继
兄弟结点:指定结点同一层且同一个前驱的结点
堂兄弟结点:指定结点同一层且不是同一个前驱的结点
结点之间的路径:根结点到指定结点(只能从上往下)
路径长度:指的经过了几条边(只能从上往下)
结点,树的属性描述
结点的层次(深度):从上往下数
结点的高度:从下往上数
树的高度(深度):总共多少层
结点的度:结点有几个分支
树的度:各结点的度的最大值
树的分类
有序树:逻辑上树中的结点的各子树从左到右是有次序的,不能互换。
无序树:逻辑上树中的结点 ...