数据结构整理

一、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)(修改指针)
空间分配 静态分配,可能溢出 动态分配,无溢出
  • 栈与队列区别:栈先进后出(栈顶操作),队列先进先出(队尾入、队头出)。
  • 哈希冲突解决方法:链地址法(常用)、线性探测法、二次探测法。
  • 常见问题:野指针(未初始化/指向已释放内存)、内存泄漏(未释放堆内存)、大小端存储(小端:低字节存低地址;大端:低字节存高地址)。
相关推荐
爱吃汽的小橘6 小时前
异步串口通信和逻辑分析仪
运维·服务器·网络·单片机·嵌入式硬件·fpga开发
m0_555762906 小时前
伺服滑差补偿方案
单片机
猫头虎7 小时前
HAMi 2.7.0 发布:全面拓展异构芯片支持,优化GPU资源调度与智能管理
嵌入式硬件·算法·prompt·aigc·embedding·gpu算力·ai-native
沐欣工作室_lvyiyi7 小时前
基于单片机的智能家居窗帘控制系统设计(论文+源码)
单片机·嵌入式硬件·毕业设计·智能家居·智能窗帘
嵌入式分享7 小时前
嵌入式分享#41:RK3576改UART波特率【精简版】
linux·嵌入式硬件·ubuntu·嵌入式
典则8 小时前
STM32FreeRtos入门(四)——任务状态和调度
stm32·单片机·嵌入式硬件
充哥单片机设计8 小时前
【STM32项目开源】基于STM32的智能天然气火灾监控
stm32·单片机·嵌入式硬件
充哥单片机设计8 小时前
【STM32项目开源】基于STM32的智能仓库火灾检测系统
stm32·单片机·嵌入式硬件
A9better11 小时前
嵌入式开发学习日志38——stm32之看门狗
stm32·嵌入式硬件·学习