 一、C语言基础与Linux操作
一、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%d4 [-2³¹, 2³¹-1] unsigned int%u4 [0, 2³²-1] float%f4 有效位6-7位 double%lf8 有效位15-16位 char%c1 [-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)(修改指针) | 
| 空间分配 | 静态分配,可能溢出 | 动态分配,无溢出 | 
- 栈与队列区别:栈先进后出(栈顶操作),队列先进先出(队尾入、队头出)。
- 哈希冲突解决方法:链地址法(常用)、线性探测法、二次探测法。
- 常见问题:野指针(未初始化/指向已释放内存)、内存泄漏(未释放堆内存)、大小端存储(小端:低字节存低地址;大端:低字节存高地址)。