开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情。
一、链表的基本概念
-
链表引出
-
数组有缺陷
-
静态空间,一旦分配内存就不可以动态扩展,要不分配不够,要不分配过多
-
对于数组头部进行插入和删除效率低
-
-
链表的组成
-
链表是由节点组成的
-
节点由 数据域 和 指针域组成
-
struct LinkNode { int num ; struct LinkNode * next; }
-
-
链表的分类
-
方式1 静态链表 动态链表
-
方式2 单向链表 双向链表 单向循环链表 双向循环链表
-
链表基本概念解析图
二、静态链表和动态链表
-
静态链表 创建在栈上
-
动态链表 创建在堆区
三、链表的基本使用
-
带头节点链表 好处在于 头节点永远都是固定的
-
初始化链表
struct LinkNode * pHeader = init_LinkList () -
遍历链表
void foreach_LinkList( struct LinkNode * pHeader ) -
插入链表
void insertLinkList( struct LinkNode*pHeader , int oldval ,int newval )- 在oldval前插入 newVal,如果没有oldval就进行尾插
-
删除链表
void delete_LinkList( struct LinkNode*pHeader, int val )-
用户提供的有效数据 删除掉
-
无效数据 直接return
-
-
清空链表
-
void clear_LinkList(struct LinkNode*pHeader ) -
将所有有数据的节点释放掉
-
-
销毁链表
-
void destroy_LinkList(struct LinkNode*pHeader) -
将整个链表都释放掉
-
链表基本使用解析图
四、函数指针的定义
-
先定义出函数类型,再通过类型定义出函数指针
-
typedef void(FUNC_TYPE)(); -
FUNC_TYPE * pFunc = func;
-
-
先定义出函数指针类型,再定义函数指针
-
typedef void(*FUNC_TYPE)(); -
FUNC_TYPE pFunc = func;
-
-
直接定义函数指针变量
void(* pFunc )() = func;
-
函数指针和指针函数的区别
-
//函数指针 是指向函数的 指针
-
//指针函数 函数的返回值是一个指针的 函数
-
-
函数指针的数组定义
void(*pFunc[3])();
五、回调函数
-
函数指针做函数参数( 回调函数 )
- 提供一个通用的函数,可以打印任意的数据类型
-
回调函数案例
-
提供一个函数,打印任意类型的数组
-
提供一个查找数组中元素的函数
-