数据结构之——《单链表》

  • 1.链表概念
  • 2.链表分类
  • 3.接口函数实现

1.链表概念

链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现。

2.链表分类

(1)单向、双向
(2)带头、不带头
(3)循环、非循环

这些组合一共有8种链表类型,但在实际中最常用的还是两种结构;
(1)无头单向非循环链表
特点:结构简单,一般不会单独用来存数据,更多的是作为其他数据结构的子结构,如哈希桶,图的邻接表等。
(2)带头双向循环链表
特点:结构最复杂,一般用在单独存储数据,实际中使用的链表数据结构都是带头双向循环链表。

3.接口函数实现

(1)初始化链表

代码如下(示例):

void listInit(list* lst)
{if (lst == NULL)return;lst->_head = NULL;
}

(2)创建节点

代码如下(示例):

listNode* creatNode(LDataType val)
{struct listNode* node = (listNode*)malloc(sizeof(listNode));node->_data = val;node->_next = NULL;return node;
}

(3)尾插一个元素

代码如下(示例):

void listPushBack(list* lst,LDataType val)
{if (lst == NULL)return;//第一种情况:空链表插入第一个数据if (lst->_head == NULL){//创建节点lst->_head = creatNode(val);}else{//遍历找到最后一个节点listNode* tail = lst->_head;while (tail->_next != NULL){tail = tail->_next;}tail->_next = creatNode(val);}}

(4)尾删一个元素

代码如下(示例):

void listPopBack(list* lst)
{if (lst == NULL||lst->_head==NULL)return;struct listNode* tail = lst->_head;struct listNode* prev = NULL;//遍历找到最后一个节点while (tail->_next != NULL){prev = tail;tail = tail->_next;}//删除节点free(tail);//修改指向if (prev == NULL)lst->_head = NULL;elseprev->_next = NULL;
}

(5)头插一个元素

代码如下(示例):

void listPushFront(list* lst, LDataType val)
{if (lst == NULL)return;//空的链表,插入第一个数据if (lst->_head == NULL)lst->_head = creatNode(val);else{listNode* node = creatNode(val);listNode* next = lst->_head;lst->_head = node;node->_next = next;}
}

(6)头删一个元素

代码如下(示例):

void listPopFront(list* lst)
{if (lst == NULL||lst->_head==NULL)return;struct listNode* next = lst->_head->_next;//释放头结点free(lst->_head);lst->_head = next;
}

(7)中间位置插入一个元素

代码如下(示例):

void listInsertAfter(listNode* cur, LDataType val)
{listNode* node = creatNode(val);listNode* next = cur->_next;cur->_next = node;node->_next = next;
}

(8)中间位置删除一个元素

代码如下(示例):

void listEraseAfter(listNode* cur)
{listNode* next = cur->_next;if (next == NULL)return;struct listNode* nextnext = next->_next;free(next);cur->_next = nextnext;
}

(9)中间节点数据的查找

代码如下(示例):

listNode* listFind(list* lst, LDataType val)
{if (lst == NULL || lst->_head == NULL)return NULL;//从第一节点开始遍历,直到找到val的值,返回此值得指针struct listNode* cur = lst->_head;while (cur){if (cur->_data == val)return cur;cur = cur->_next;}return NULL;
}

(10)链表的Destroy

代码如下(示例):

void listDestroy(list* lst)
{if (lst == NULL || lst->_head)return;struct listNode* cur = lst->_head;while (cur){listNode* next = cur->_next;free(cur);cur = next;}lst->_head = NULL;
}

数据结构之——《单链表》相关推荐

  1. python链表怎么定义_Python数据结构之双向链表的定义与使用方法示例

    本文实例讲述了Python数据结构之双向链表的定义与使用方法.分享给大家供大家参考,具体如下: 和单链表类似,只不过是增加了一个指向前面一个元素的指针而已. 示意图: python 实现代码: #!/ ...

  2. Java——数据结构之双向链表

    文章目录 Java--数据结构之双向链表 1.单链表的实现 (1)定义一个节点类型 (2)头插法 (3)尾插法 (4)根据下标插入节点 (5)查找关键字 (6)删除第一次出现的关键字 (7)删除所有出 ...

  3. 图解Java数据结构之双向链表

    上一篇文章说到了单链表,也通过案例具体实现了一下,但是单链表的缺点也显而易见. 单向链表查找的方向只能是一个方向 单向链表不能自我删除,需要靠辅助节点 而双向链表则能够很轻松地实现上面的功能. 何为双 ...

  4. 数据结构实验--双向链表及其应用

    数据结构实验一: 实验要求: 1.编写使用freelist的带头.尾节点的双向链表类的定义,实现双向链表的基本操作. 2.利用双向链表实现2个一元多项式的加法和乘法运算,运算结果得到的链表要求按照指数 ...

  5. 【Java 数据结构】双向链表

    篮球哥温馨提示:编程的同时不要忘记锻炼哦! 圆圆的脑袋,大大耳朵,天天敲代码,找找找bug 目录 1.什么是双向链表 2.实现一个双向链表 2.1 实现前的约定 2.2 addFirst 方法 2.3 ...

  6. Java数据结构:双向链表的实现

    文章目录 1 双向链表 1.1 双向链表介绍 1.2 双向链表实现思路 2 双向链表实现完整代码 2.1 节点类 Student.java 2.2 双向链表实现类 StudentDoubleLinke ...

  7. [数据结构]实现双向链表

    作者: 华丞臧. 专栏:[数据结构] 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞+收藏+关注).如果有错误的地方,欢迎在评论区指出. 文章目录 一.带头双向循环链表 二.带头双向循环链表接 ...

  8. java数据结构:双向链表结构与实现

    本教程的内容基本来自于<Java数据结构与算法> 单向链表的缺点在于每个节点只能知道自己与下一个节点,无法寻找到上一个节点.而双向链表可以解决这个问题,通过在节点内部添加一个previou ...

  9. 数据结构-带头双向链表的建立,详细教程

    前言 上一篇文章中我们学习了单链表的实现 本节将带大家学习带头双向链表的实现,希望能够对大家有一些帮助,话不多说,直接开干!! 文章目录 前言 一.带头双向链表的概念和结构 二. 带头双向链表的接口实 ...

  10. 数据结构之双向链表(Java代码)

    目录 为什么会有双向链表 单向链表的缺点 双向链表示意图 Java代码实现 为什么会有双向链表 首先要明白单链表,对单链表还比较朦胧的可以去下面的链接扫一眼. 数据结构之单链表超详细 单向链表的缺点 ...

最新文章

  1. 如果你喜欢一个程序员小伙
  2. Google Test(GTest)使用方法和源码解析——模板类测试技术分析和应用
  3. C# 8的新提案:new关键字类型推断
  4. ai边缘平滑_AI基础教程113:“效果”菜单之“画笔描边”(一)喷溅效果
  5. 小孔成像实验探究的软件_【亲子实验】科学小制作:神秘小潜艇科学小论文作品在科学课(小学版)2004年第5期发表,科学小发明潜水艇与沉浮子...
  6. 汇编_指令_FLAGS
  7. html获取子节点数量,css判断子元素个数
  8. React 折腾记 - (4) 侧边栏联动Tabs菜单-增强版(结合Mobx)
  9. 宏定义_do{...} while(0U)宏定义的作用和意义
  10. 机器学习十大算法的核心思想、工作原理、适用 情况及优缺点
  11. Cmax最优但∑Ci不一定最优 例子
  12. drawroundrect java_java – fillRoundRect看似无法正确呈现的问题
  13. android开机自动启动app,android如何实现开机自动启动Service或app
  14. java gc 监控_JAVA网站full GC监控脚本
  15. RuntimeError: Unable to open shape_predictor_68_face_landmarks.dat
  16. Ubuntu Linux访问小米手机存储卡
  17. 关于React报Too many re-renders. React limits the number of renders to prevent an infinite错误的解决方案
  18. openstack 无法创建实例之消息队列问题
  19. 加密市场熊市最后的曙光——Treasure Project(藏宝计划)
  20. matlab绘制系统的根轨迹

热门文章

  1. 上传图片在浏览器可以正常查看 在手机不显示_手机主题微信气泡主题星河银...
  2. 【linux】循序渐进学运维-基础篇-进程管理
  3. python可以启动多少线程_多少千瓦的电机可以直接启动?怎么算出来的?
  4. 大话备考之数据结构综合题
  5. JAVA使用web3j开发以太坊实战案例
  6. linux uboot nfs启动,嵌入式uboot,内核启动通过nfs挂载根文件系统
  7. 从数据的属性看数据资产
  8. Electron-builder Windows平台打包安装后执行指定的bat脚本(exe)
  9. 天津中德应用技术大学计算机专业,天津中德应用技术大学高职专业介绍(一)...
  10. HX=JE,HX-JE芯片无感升压ic