C语言之链表使用

154 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情

一、链表的基本概念

  1. 链表引出

    • 数组有缺陷

    • 静态空间,一旦分配内存就不可以动态扩展,要不分配不够,要不分配过多

    • 对于数组头部进行插入和删除效率低

  2. 链表的组成

    • 链表是由节点组成的

    • 节点由 数据域 和 指针域组成

    • struct LinkNode { int num ; struct LinkNode * next; }

  3. 链表的分类

    • 方式1 静态链表 动态链表

    • 方式2 单向链表 双向链表 单向循环链表 双向循环链表

链表基本概念解析图

链表的基本.jpg

二、静态链表和动态链表

  1. 静态链表 创建在栈上

  2. 动态链表 创建在堆区

三、链表的基本使用

  1. 带头节点链表 好处在于 头节点永远都是固定的

  2. 初始化链表 struct LinkNode * pHeader = init_LinkList ()

  3. 遍历链表 void foreach_LinkList( struct LinkNode * pHeader )

  4. 插入链表 void insertLinkList( struct LinkNode*pHeader , int oldval ,int newval )

    • 在oldval前插入 newVal,如果没有oldval就进行尾插
  5. 删除链表 void delete_LinkList( struct LinkNode*pHeader, int val )

    • 用户提供的有效数据 删除掉

    • 无效数据 直接return

  6. 清空链表

    • void clear_LinkList(struct LinkNode*pHeader )

    • 将所有有数据的节点释放掉

  7. 销毁链表

    • void destroy_LinkList(struct LinkNode*pHeader)

    • 将整个链表都释放掉

链表基本使用解析图

链表.jpg

四、函数指针的定义

  1. 先定义出函数类型,再通过类型定义出函数指针

    • typedef void(FUNC_TYPE)();

    • FUNC_TYPE * pFunc = func;

  2. 先定义出函数指针类型,再定义函数指针

    • typedef void(*FUNC_TYPE)();

    • FUNC_TYPE pFunc = func;

  3. 直接定义函数指针变量

    • void(* pFunc )() = func;
  4. 函数指针和指针函数的区别

    • //函数指针 是指向函数的 指针

    • //指针函数 函数的返回值是一个指针的 函数

  5. 函数指针的数组定义

    • void(*pFunc[3])();

五、回调函数

  1. 函数指针做函数参数( 回调函数 )

    • 提供一个通用的函数,可以打印任意的数据类型
  2. 回调函数案例

    • 提供一个函数,打印任意类型的数组

    • 提供一个查找数组中元素的函数