基础数据结构_C语言实现
内容
- 数据结构的基础概念和时间空间复杂度
- 线性表:顺序表、链表
- 顺序表(定长的、扩容的)
- 单链表(带头结点的、不带头结点的)
- 需要动手实践,大量的面试题
- 栈(顺序栈、链栈)
- 用两个栈实现一个队列
- 队列(顺序队、链队)
- 用两个队实现一个栈
- 串(字符数组)
- API实现(strcpy strcat srtcmp strlen)
- 字符串的查找(BF、KMP算法)
- 双向链表、循环链表、双向循环链表
- 八大排序算法
- 冒泡排序
- 二路归并排序
- 插入排序
- 希尔排序
- 堆排序
- 基数排序(桶排序)
- 快速排序
- 选择排序
概念
数据结构
- 集合
- 线性(现实生活中的排队)
- 树型(部门架构、族谱)
- 图型(交通网络、六度分割理论、网络拓扑)
时间复杂度
执行语句与问题规模之间的函数
- O(1): 没有循环,或者有循环但是循环的退出条件和问题规模之间没有关系;
- O(n): 有循环,循环的退出条件与问题规模之间存在关系,并且控制循环的变量以++或者–的方式执行
- O(n^2): 有循环,嵌套一层。
- O(logn): 有循环,循环的退出条件与问题规模之间存在关系,并且控制循环的变量每次*2或/2的方式执行。
空间复杂度
算法所需的额外存储空间(除了函数本身计算申请的内存外)与问题规模之间的关系。
1 | void Show(int arr[], int len) |
此处,函数参数中的int arr[]和int len不是额外存储空间。而是for循环。
线性表
- 唯一的头(此处的头指的是第一个有效节点),唯一的尾。
- 除了头,剩余的节点都有前驱。除了尾,剩余的节点都有后继。
定长顺序表
相当于一个特殊使用的数组。
但存放数据是按顺序来存的,不能随意位置存放。
1 | //sqlist.h |
1 |
|
不定长顺序表
1 | //sqlist.h |
1 | void Inc(PDsqlist plist) |
单链表
- 第一种大厂笔试/面试中常用,主要考察对边界条件检测的掌握力;
- 不带头结点的逆置和带头结点的逆置难度不一样。
- 第二种实际编程中常用,方便好用;
- 第三种的循环无意义,因为功能和头指针差不多。
- 第四种是加了一个尾指针,使尾插也变O(1),但代价是需要对尾指针进行密切维护。