IO
每个程序在运行时默认打开的三种流:
- stdio 标准输入流
- stdout 标准输出流
- stderror 标准错误流(没有缓冲区)
IO分为标准IO和文件IO
标准IO和文件IO的区别 :
- 标准IO是由标准c库提供的,文件IO是由操作系统提供的,只能在特定的操作系统下使用。相比之下,标准IO的可移植性更好
- 标准IO有缓冲区,文件IO没有缓冲区,标准IO可以减少系统调用的次数,文件IO就是系统调用
- 标准IO是通过文件流指针FILE *操作文件,文件IO是通过文件描述符操作文件
- 标准IO只能访问普通文件,文件IO不限制
标准IO:
fgets和gets的区别:
fgets只能读入传入的size-1个参数,如果传入的字符数量少于size-1个,那么\n也会被读入。gets不会读入\n,也不会进行越界检查,这是很危险的。
fputs和puts的区别:
fputs只会原样输出,puts默认加上换行
文件IO:
open函数的返回值是文件描述符,一种非负最小的整数,默认前三个都被系统占用了
三种缓冲区类型
- 全缓存;当缓存区满的时候或者程序结束,或者强制刷新(fflush)的时候,就会刷新(读入内存或写入文件)
- 行缓存:当遇到'\n'或者缓冲区满,强制刷新,程序结束时。才会刷新
- 不带缓存;有些库函数不带缓存
对目录的操作
静态库和动态库的区别
- 载入时刻不同:静态库是编译时载入的;动态库是在运行时才载入
- 动态库升级后便可直接使用,静态库升级后需要重新编译才能运行
- 静态库的可移植性更好
- 链接静态库生成的可执行文件更大
- 多个程序都需要用到同一个静态库的重复代码很多,动态库可以实现多个程序共享一个库
stat获取文件属性
数据结构
数据结构的三要素:逻辑结构,存储结构和数据运算
存储结构
- 顺序存储:在逻辑上相邻的元素,在物理空间上也相邻。
- 优点:查找方便,存储空间的利用率可以达到1
- 缺点:插入和删除不方便,申请空间的时候,必须是一块连续的空间,对空间的要求比较大,会有空间碎片的产生
- 链式存储:在逻辑上相邻的元素,在物理空间上不一定相邻
- 优点:插入和删除元素方便,对空间的要求不那么大
- 缺点:查找不方便。空间利用率不足1,没有顺序存储的大
- 索引存储:依照索引表查找数据大概的位置,详细查找数据本身(冲突没有解决的哈希存储)
- 优点:查找方便
- 缺点:有索引表的存在,要浪费空间。插入和删除元素后,索引表也要更新
- 哈希存储:根据关键字直接就能定位到记录本身,就能拿到数据
- 优点:查找方便,插入和删除也方便
- 缺点:如果哈希表设计不合理,查找的效率就会很低
线性表和顺序表和链表的区别?
线性表是逻辑结构,顺序表和链表是线性表在顺序存储和链式存储下的体现。
顺序表(存储结构为顺序存储)和链表(存储结构为链式存储)
顺序表:静态分配空间,地址连续,按照下标查找元素最快,时间复杂度为O(1)
链表:动态分配空间,地址不连续,插入和删除元素最快,时间复杂度为O(n)
顺序表和链表的区别:
- 顺序表是顺序存储的,链表是链式存储的
- 顺序表会有空间碎片产生,链表没有存储碎片产生
- 链表一般用于插入和删除较多的场景,顺序表一般用于按下标查找较多的场景
- 顺序表的存储空间利用率比链表大
顺序表和链表该如何选择?
- 从空间来说:顺序表对空间的要求比链表的大。顺序表的利用率比链表好
- 从使用情景来说:顺序表适合查找较多的情景,链表适合插入和删除较多的场景
- 从编译器来说:不支持指针操作的编译器不能用链表
编译器不支持指针类型操作,但又是插入和删除较多的场景:使用静态链表,本质上是二维数组
栈 :一种操作受限的线性表
特点:先进后出,只能在栈顶进行操作
顺序栈
结构体的定义:
操作:
链栈:
结构体的定义:
操作:
队列
特点:先进先出,头部出队,尾部入队
顺序队列
结构体的定义:
操作:
链队列
结构体定义:
操作:
树
结构体的定义:
操作:
常见的排序算法
选择排序
冒泡排序:从左到右依次比较相邻元素,如果大的就交换,每排序一次就少排序一次
插入排序:从无序队列里插入到有序队列里的合适的位置,有序元素依次往后挪,腾位置
快速排序:确定基准,左右指针,尾指针指向的值比基准小就赋值给头指针的值,头指针指向的值比基准大就赋值给尾指针指向的,最后首尾指针相等的地方就是基准该放的地方
这是在华清远见学习数据结构的总结,个人比较懒,所以稍稍偷工减料了