一.IO
1.什么时IO
input,output 输入输出
2.标准IO和文件IO区别
标准IO:
(1).标准IO是有库函数系统提供的,由ANSI C标准定义
(2).是带缓冲区的,运行速率较高
(3).可以跨平台
(4).标准I0超重的依据一般为流指针
文件IO:
(1).文件IO是由操作系统提供的,由POSIX(可移植操作系统接口)定义
(2).没有缓冲区,运行效率没有标准IO高
(3).不支持跨平台
(4).文件IO操作依据文件描述符(非负整数)
3.系统调用和库函数
系统调用:操作系统提供给用户的一组硬件接口
库函数:对系统调用二次封装
4.系统调用与库函数区别
(1).系统调用一般提供基础的功能,库函数提供较复杂的功能
(2).系统调用一般不能重写,库函数可以重写
(3).系统调用运行时间为机械时间,库函数为用户时间
(4). 系统调用运行空间为内核空间,库函数为用户空间
(5).系统调用的返回值一般为非负整数,库函数 返回值不一定
(6).系统调用运效率没有库函数的高
(3).系统调用的移植性没库函数的好
5.文件描述符
是一个非负整数
本质是个数组下标
6.打开文件
fopen
以字符读写:
fputc 和 fgetc
以 行 读 写 :
f g e t s 和 f p u t s
以 对 象 读 写 :
f r e a d 和 f w r i t e
以格式化读写:
f s c a n f 和 f p r i n t f
fclose: fflsh:强制刷新由参数
feof:
判断文件是否到末尾:
函数功能:打开由参数1描述的文件,打开的方式由参数2确定
函数参数1:需要被打开的文件的路径
函数参数2:打开的方式
r : 以只读的形式打开文件,文件存在则打开,不存在则报错
r+ : 以读、写的形式打开文件,文件存在则打开,不存在则报错
w : 以只写的形式打开文件,文件存在则清空打开,文件不存在则新建
w+ : 以读、写的形式打开文件,文件存在则清空打开,文件不存在则新建
a : 以追加的形式打开文件,文件存在则追加,文件不存在则新建
a+ : 以可读可写(追加)的形式打开文件,文件存在则追加,文件不存在则新建
函数返回值:成功返回:文件流指针
失败返回NULL,并且更新errno
6.静态库与动态库
二.数据结构
1.结构是什么
数据:现实生活中一切可以处理的信息
结构:逻辑结构、存储结构
研究的是数据的逻辑结构,存储结构及其操作。
逻辑结构:事物与事物之间在现实生活中的抽象的一种逻辑关系
顺序存储:在逻辑上相邻的元素,在物理空间上也相邻
优点:查找方便,
存储空间的利用率可以达到1
缺点:插入和删除不方便,
申请空间的时候,必须是一片连续的空间,对空间的要求比较高
会用空间碎片的产生
链式存储:在逻辑上相邻的元素,在物理空间上不一定相邻
优点:插入元素不需要移动大量的空间
对空间的要求没那么大,
缺点:查找不方便
存储空间的利用率不足1,没有顺序存储的大
索引存储:依据索引表查找数据大概位置,详细查找数据本身(冲突没有解决号的哈希存储)
优点:查找方便
缺点:有索引表的存在,要浪费空间
插入元素,删除元素之后,索引表要更新
哈希存储:根据关键字直接就能定位到记录本身,就能拿到数据
优点:查找方便,插入,删除也方便
缺点:如果哈希函数设计的不合理,查找的效率就会很低
线性表,链表,顺序表之间的区别?
线性表是一种逻辑结构
顺序表和链表是线性表在顺序存储下和链式存储下的体现
链表和顺序表的区别:
1.链表是链式存储,顺序表是顺序存储
2.顺序表会有空间碎片产生,链表没有空间碎片产生
3.链表一般多用于插入、删除较多的场景
顺序表一般用于查找较多的场景
4.顺序表的存储空间利用率比链表的大
链表和顺序表怎么选择?
1.从空间来说
顺序表对空间的要求比链表大
顺序表的利用率比链表大
2.从操作来说
多用于查找,用顺序表
多用于插入、删除,用链表
3.从编译环境来说
不支持指针类型操作的编译器不能使用链表
2.受限的线性表:
栈:受限在了操作上
队列:受限在了操作上
串:受限在了存储上
栈:
顺序存储:
同顺序表:
栈的定义:
只允许数据在一段进行插入和删除操作,允许操作的一段叫做栈顶
特点:先进后出(FILO)
只允许在一段执行插入操作,另一端执行删除操作,允许插入的一段叫做队尾,允许删除操作的一段叫做队头
特点:先进先出(FIFO)
只允许存储字符 * ' a — 1
3.数的节点遍历
先 序 遍 历 :
中 序 遍 历 :
后 序 遍 历 :
深 度 优 先 :
广 度 优 先 :
层 次 遍 历 :
队 列
4.算法
算 法 是 有 限 指 令 的 有 序 集 合 。 算 法 是 有 穷 的 , 程 序 是 无 穷 的 程 序 = 算 法 + 数 据 结 构
5.算 法 的 特 征 :
有 穷 性:算 法 必 须 在 有 限 个 语 句 能 描 述 完 确 定 性 ( 无 二 义 性 ):每 一 条 语 句 只 能 有 一 个 解 释 可 行 性:能 运 行 的 输 入: 输出:
6.构建哈希函数
直接地址法:
平方取中法
叠加法:
质数除余法:
7.冲突
冲突:
什么是冲突:冲突是指:表中某地址j∈[0,m-1]中己存放有记录,而另一个记录的H(key)值也为j。
怎么解决冲突:
开放地址法:
不太好,因为会将哈希表退化成线性表,还只能使用顺序查找。
再次哈希法:
也不好,因为麻烦
链地址法:
8.常 见 的 排 序 算 法 :
内 部 排 序
直接 插 入 : 重 新 构 建 一 个 链 表
折 半 插 入 : 和 二 分 查 找 类 似
希 尔 排 序 : 增 量 , 逐 渐 减 少 的 , 直 到 增 量 为 1 为 止
冒泡:每一次运行总会将最小的或者最大的放到前面,如果需要交换,一直在交换
快速排序*
多路归并:
基数排序
外部排序:
基于多路归并的外部排序: