二级C语言
队列
计算队列中元素个数
种 : rear > front ,直接减
第二种: rear < front
上面两种综合一起,求元素个数公式 :(r - f + maxsize) % maxsize
栈
栈中元素个数计算
栈S(1,m)
第一步:判断栈是正栈还是倒栈
正栈初始状态(空栈):top<1
倒栈初始状态(空栈):top>m
第二步:计算元素个数
若为正栈:元素个数=top-1+1
若为倒栈:元素个数=m-top+1
二叉树
注:若二叉树中某结点仅有一个子结点时,不能由前序遍历和后序遍历得出中序遍历的访问顺序。
二叉树的计算
-
n个节点的二叉树一共有((2n)!)/(n! * (n+1)!)种
-
n层二叉树的第n层最多为2^(n-1)个
-
二叉树节点计算公式 N = n0+n1+n2,
度为0的叶子节点比度为2的节点数多一个。
N=1n1+2n2+1
-
对任何一棵二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1
-
具有n个节点的完全二叉树的深度为log2(n) + 1
-
B-树,除叶子与根节点以外的任意结点的分支数介于[m/2,m](取上整)
-
具有n 个结点的完全二叉树的深度为[log2n]+1
-
树的高度:从根节点到所有叶节点中最大的边的数目。
-
树的深度:从根节点到所有叶节点中最多的节点数目。
关系模型范式
1NF: 字段是最小的的单元不可再分
2NF:满足1NF,表中的字段必须完全依赖于全部主键而非部分主键 (一般我们都会做到)
3NF:满足2NF,非主键外的所有字段必须互不依赖
BCNF:满足3NF,消除表中的多值依赖
结构体
一、结构体变量的定义
1.结构体类型与结构体变量分开定义
一般形式如下:
struct<结构体名><结构体变量名>;
eg:struct student student1,student2;
关键字struct要与结构体名student一起使用,共同构成结构体类型名
2.结构体类型与结构体变量同时定义
一般形式如下:
struct<结构体名>
{
<成员列表>
}<结构体变量名>;
3.无名结构体与结构体变量同时定义
一般形式如下:
struct
{
<成员列表>
}<结构体变量名>;
由于这里省略了结构体名,没有完整的结构体类型名,所以不能在其他位置再定义此结构体类型的变量
4.使用typedef为已有结构体类型取“别名”
一般形式如下:
typedef struct
{
<成员列表>
}<别名>;
这里的别名就相当于结构体类型名,之后就可以使用它定义结构体变量了
eg:
typedef struct
{
<成员列表>
}STU;
STU student1,student2;
那么这里就定义了俩个结构体变量student1,student2
二、结构体引用
1.通过“ · ”引用
结构体变量名.成员名
注:注意结构体变量名与成员名之间有点
2.通过“->”引用
结构体指针变量名->成员名
排序算法
时间复杂度
最多:插入排序=希尔排序=选择排序=冒泡排序=快速排序>堆排序
最少:选择排序>堆排序=快速排序>插入排序=希尔排序=冒泡排序
最坏情况查找次数 二分法 log2n
文件读写
符号 | 注释 |
---|---|
r | 只读 |
r+ | 读写,从头开始 |
w | 只写,不存在则新建;存在则清空; |
w+ | 读写,不存在则新建;存在则清空; |
a | 追加,不存在则新建;存在则从文件尾开始; |
..x | 只新建,存在则不能打开 |
存储结构
线性结构
线性结构是一个有序数据元素的集合。常用的线性结构有:线性表,栈,队列,双队列,数组,串。
注:一维数组是线性结构
非线性结构
非线性结构,数学用语,其逻辑特征是一个结点元素可能有多个直接前趋和多个直接后继。常见的非线性结构有:二维数组,多维数组,广义表,树(二叉树等)。
注:有一个以上根结点的数据结构一定是非线性结构。
系统结构图
1、深度:程序结构的层次数,可以反映程序机构的规模和复杂程度。
2、宽度:同一层模块的最大模块个数
3、模块的扇出:一个模块调用(或控制)的其他模块数
4、模块的扇入:调用(或控制)一个给定模块的模块个数
深度---------层数
宽度---------同一层模块的最大模块个数
最大扇入数------------系统结构从最上级到可以调用的最低一级的模块行数
最大扇出数------------该系统结构中模块可以直接调用的下级模块最大数目
优先级 | 运算符 | 结合律 |
---|---|---|
1 | 后缀运算符:[] () · -> ++ --(类型名称){列表} | 从左到右 |
2 | 一元运算符:++ -- ! ~ + - * & sizeof_Alignof | 从右到左 |
3 | 类型转换运算符:(类型名称) | 从右到左 |
4 | 乘除法运算符:* / % | 从左到右 |
5 | 加减法运算符:+ - | 从左到右 |
6 | 移位运算符:<< >> | 从左到右 |
7 | 关系运算符:<<= >>= | 从左到右 |
8 | 相等运算符:== != | 从左到右 |
9 | 位运算符 AND:& | 从左到右 |
10 | 位运算符 XOR:^ | 从左到右 |
11 | 位运算符 OR:| | 从左到右 |
12 | 逻辑运算符 AND:&& | 从左到右 |
13 | 逻辑运算符 OR:|| | 从左到右 |
14 | 条件运算符:?: | 从右到左 |
15 | 赋值运算符: = += -= *= /= %= &= ^= |= <<= >>= | 从右到左 |
16 | 逗号运算符:, | 从左到右 |
字符串函数
序号 | 函数 & 目的 |
---|---|
1 | strcpy(s1, s2); 复制字符串 s2 到字符串 s1。(覆盖str1) |
2 | strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。(拼接) |
3 | strlen(s1); 返回字符串 s1 的长度。 |
4 | strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。 |
5 | strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。(从字符串的首地址开始查找) |
6 | strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。(从字符串的首地址开始查找) |
注:首地址就是该变量所占的存储区域中的第一个单元的地址。
sizeof(int) 4 sizeof(float) 4 sizeof(double) 8 sizeof(char) 1
- scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
- getchar()、getche()、getch():这三个函数都用于输入单个字符。
- gets():获取一行数据,并作为字符串处理。
白盒黑盒测试
黑盒测试---------功能测试 软件的接口测试
等价类划分法、边界值分析法、因果图法、错误推测法
白盒测试---------结构测试 对软件的过程性细节做细致的检查
程序结构分析、逻辑覆盖方测试、基本路径测试
概念
-
栈和队列都是一种特殊的操作受限的线性表,只允许在端点处进行插入和删除。
二者的区别是:栈只允许在表的一端进行插入或删除操作,是一种"后进先出"的线性表;而队列只允许在表的一端进行插入操作,在另一端进行删除操作,是一种"先进先出"的线性表。
-
根据数据结构中各数据元素之间前后关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。
如果一个非空的数据结构满足下列两个条件:① 有且只有一个根结点;② 每个结点最多有一个前件,也最多有一个后件。则称该数据结构为线性结构,又称线性表。所以线性表、栈与队列、线性链表都是线性结构,而二叉树是非线性结构。
-
我们通常用时间复杂度和空间复杂度来衡量算法效率,算法的时间复杂度是指执行算法所需要的计算工作量;算法所执行的基本运算次数与问题的规模有关,而一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间;一般来说,一种数据的逻辑结构根据需要可以表示成多种存储结构。
-
在先左后右的原则下,根据访问根结点的次序,二叉树的遍历可以分为3种:前序遍历、中序遍历和后序遍历。
前序遍历是指在访问根结点、遍历左子树与遍历右子树这三者中,首先访问根结点,然后遍历左子树,最后遍历右子树;并且遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。 -
二叉树的性质3:在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。
-
对于长度为n的线性表,在最坏的情况下,快速排序所需要的比较次数为n(n-1)/2;冒泡排序所需要的比较次数为n(n-1)/2;直接插入排序所需要的比较次数为n(n-1)/2;堆排序所需要的比较次数为
\[O(nlog2n) \] -
所谓循环队列,就是将队列存储空间的最后一个位置绕到第1个位置,形成逻辑上的环状空间,供队列循环使用。所以循环队列属于线性结构。
循环队列的头指针front指向队列的第一个元素的前一位置,队尾指针rear指向队列的最后一个元素,循环队列的动态变化需要头尾指针共同反映。
循环队列的长度是:(sq.rear-sq.front+maxsize)%maxsize,所以循环队列的长度是由队头和队尾指针共同决定的。
-
二分法检索要求线性表结点按关键值排序且以顺序方式存储。在查找时,首先与表的中间位置上结点的关键值比较,若相等则检索成功;否则根据比较结果确定下一步在表的前半部分或后半部分继续进行。
-
二分法检索的效率比较高,设线性表有n个元素,则最多的检索次数为大于log2n(2为底数)的最小整数,最少的检索次数为1。
-
顺序存储结构就是用一组地址连续的存储单元依次存储该线性表中的各个元素,链式存储结构中各数据结点的存储序号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。
两者都可以存储线性的、有序的逻辑结构。顺序结构使用的是连续物理空间,链式结构可以使用零散的物理空间存储,链式结构更灵活,不存在谁节约空间的说法。
-
栈是一种只能在一端进行插入或删除操作的线性表。
在主程序调用子程序时要首先保存主程序当前的状态,然后去执行子程序,最终把子程序的执行结果返回到主程序调用子程序的位置,继续向下执行。这种调用符合栈"先进后出"的功能。
-
所谓算法的时间复杂度,是指执行算法所需要的计算工作量。为了能够比较客观地反映出一个算法的效率,在度量一个算法的工作量时,不仅应该与所使用的计算机、程序设计语言以及程序编制者无关,而且还应该与算法实现过程中的许多细节无关。为此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。
-
线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构
线性表的顺序存储结构的存储空间只用于存放结点数据,而链式存储结构的存储空间不仅要存放结点数据,还要存放数据的指针。
-
在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化
栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈又称"后进先出"表。