一、C语言基础与Linux操作
1. Linux常用指令与工具
- 文件操作 :
ls
(列出目录)、cd
(切换路径)、touch
(创建文件)、mkdir
(创建目录)、rm
(删除)、cp
(拷贝)、mv
(移动/重命名)、cat
(查看内容)。 - 权限管理 :
su
/sudo
(权限切换)、passwd
(修改密码)。 - vim编辑器 :
- 模式切换:命令行模式(
yy
复制、dd
剪切、u
撤销)→ 插入模式(i
/a
/o
进入)→ 底行模式(:wq
保存退出、:set nu
显示行号)。
- 模式切换:命令行模式(
- gcc编译流程 :预处理(
-E
生成.i
)→ 编译(-S
生成.s
)→ 汇编(-c
生成.o
)→ 链接(生成可执行文件),常用选项:-o
(指定输出)、-Wall
(警告)、-Werror
(警告转错误)。
2. 核心语法要点
-
数据类型 :
类型 占位符 字节大小(64位) 取值范围 int
%d
4 [-2³¹, 2³¹-1] unsigned int
%u
4 [0, 2³²-1] float
%f
4 有效位6-7位 double
%lf
8 有效位15-16位 char
%c
1 [-128, 127]或[0, 255] -
控制结构 :
- 选择结构:
if-else
(单/双/多分支)、switch
(整数/字符匹配,需break
)。 - 循环结构:
while
(条件控制)、for
(计数控制)、do-while
(至少执行1次)。 - 跳转语句:
break
(跳出循环/switch
)、continue
(结束本次循环)、goto
(无条件跳转,不建议使用)。
- 选择结构:
-
函数与指针 :
- 函数分类:无参无返、有参无返、有参有返;参数传递(值传递、地址传递)。
- 指针基础:定义(
类型 *指针名
)、初始化(指向变量、NULL
)、运算(p++
、*p
解引用)。 - 高级指针:多级指针(
int **p
)、函数指针(int (*p)(int)
)、指针函数(int *func()
)。
二、数据结构
1. 线性结构
-
顺序表:
- 概念:数组实现,逻辑结构为线性结构,存储结构为顺序存储。
- 操作:创建、插入(尾插、按下标插入)、删除(尾删、按下标删除)、修改、查找、排序(冒泡、选择排序)。
- 特点:随机访问(O(1)),插入删除需移动元素(O(n)),需预分配空间。
-
链表:
- 分类:单链表、双向链表、循环链表。
- 单链表操作:头插、尾插、按位置插入/删除、逆置、查找倒数第n个节点。
- 双向链表操作:头插、尾插、头删、尾删、正向/逆向遍历。
- 特点:动态分配内存,插入删除无需移动元素(O(1)),访问需遍历(O(n))。
-
栈:
- 概念:先进后出(FILO),表尾(栈顶)操作受限。
- 实现:顺序栈(数组)、链栈(链表头插头删)。
- 操作:入栈(push)、出栈(pop)、遍历。
-
队列:
- 概念:先进先出(FIFO),表尾插入、表头删除。
- 实现:顺序队列(假溢出问题)、循环队列(解决假溢出)、链式队列。
- 操作:入队(enqueue)、出队(dequeue)、遍历。
2. 树形结构
- 二叉树 :
- 概念:每个节点最多有2棵子树,严格区分左右子树。
- 特殊类型:满二叉树(所有非叶节点度为2)、完全二叉树(最后一层叶子集中在左侧)。
- 性质:第i层最多有2^(i-1)个节点;深度为k的树最多有2^k -1个节点;叶子节点数n0 = n2 + 1(n2为度为2的节点数)。
- 遍历:先序(根左右)、中序(左根右)、后序(左右根)。
3. 哈希表
- 概念:根据关键码值直接访问的数据结构,通过哈希函数映射存储位置。
- 哈希函数 :直接定址法、数字分析法、平方取中法、除留余数法(
H(key) = key MOD p
,p为质数)。 - 哈希冲突解决:线性探测法、二次探测法、链地址法(相同哈希值节点组成链表)。
三、算法
1. 查找算法
- 二分查找 :
- 前提:有序序列。
- 步骤:取中间元素比较,若目标值大则在右半区查找,反之在左半区,直至找到或区间为空。
- 时间复杂度:O(log2n)。
2. 排序算法
-
插入排序:
- 思想:将待排元素插入有序序列,逐步构建有序序列。
- 时间复杂度:O(n²)。
-
快速排序:
- 思想:选择基准值,将序列分为小于基准和大于基准两部分,递归排序子序列。
- 时间复杂度:平均O(nlogn),最坏O(n²)。
四、内存管理与高级特性
1. 内存分配
- 存储区域 :栈区(局部变量、函数参数,自动释放)、堆区(动态分配,
malloc
/free
)、静态区(全局变量、static
变量)。 - 动态内存函数 :
malloc
(分配内存)、calloc
(分配并初始化)、realloc
(调整大小);注意检查返回值(NULL
),避免内存泄漏、悬垂指针。
2. 结构体与共用体
- 结构体 :
- 定义:
struct 结构体名 {成员列表}
,可嵌套。 - 字节对齐:成员偏移量为自身大小整数倍,整体大小为最大成员大小整数倍。
- 定义:
- 共用体:所有成员共享同一块内存,大小为最宽成员大小。
3. 宏与枚举
- 宏定义 :
#define 宏名 宏体
(仅替换),带参数宏(#define MAX(a,b) (a>b?a:b)
)。 - 枚举 :
enum 枚举名 {成员1, 成员2}
,避免"魔鬼数字",成员为常量。
五、核心对比与面试要点
对比项 | 顺序表 | 链表 |
---|---|---|
存储方式 | 连续内存(数组) | 离散内存(节点+指针) |
访问效率 | O(1)(随机访问) | O(n)(遍历访问) |
插入删除效率 | O(n)(移动元素) | O(1)(修改指针) |
空间分配 | 静态分配,可能溢出 | 动态分配,无溢出 |
- 栈与队列区别:栈先进后出(栈顶操作),队列先进先出(队尾入、队头出)。
- 哈希冲突解决方法:链地址法(常用)、线性探测法、二次探测法。
- 常见问题:野指针(未初始化/指向已释放内存)、内存泄漏(未释放堆内存)、大小端存储(小端:低字节存低地址;大端:低字节存高地址)。