【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

有的时候,处于内存中的数据并不是连续的。那么这时候,我们就需要在数据结构中添加一个属性,这个属性会记录下面一个数据的地址。有了这个地址之后,所有的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用。

相比较普通的线性结构,链表结构的优势是什么呢?我们可以总结一下:

(1)单个节点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小

(2)节点的删除非常方便,不需要像线性结构那样移动剩下的数据

(3)节点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表

那么在实际应用中,链表是怎么设计的呢?我们可以以int数据类型作为基础,设计一个简单的int链表:

(1)设计链表的数据结构

typedef struct _LINK_NODE
{int data;struct _LINK_NODE* next;
}LINK_NODE;

(2)创建链表

LINK_NODE* alloca_node(int value)
{LINK_NODE* pLinkNode = NULL;pLinkNode = (LINK_NODE*)malloc(sizeof(LINK_NODE));pLinkNode->data = value;pLinkNode->next = NULL;return pLinkNode;
}

(3)删除链表

void delete_node(LINK_NODE** pNode)
{LINK_NODE** pNext;if(NULL == pNode || NULL == *pNode)return ;pNext = &(*pNode)->next;free(*pNode);delete_node(pNext);
}

(4)链表插入数据

STATUS _add_data(LINK_NODE** pNode, LINK_NODE* pDataNode)
{if(NULL == *pNode){*pNode = pDataNode;return TRUE;}return _add_data(&(*pNode)->next, pDataNode);
}STATUS add_data(const LINK_NODE** pNode, int value)
{LINK_NODE* pDataNode;if(NULL == *pNode)return FALSE;pDataNode = alloca_node(value);assert(NULL != pDataNode);return _add_data((LINK_NODE**)pNode, pDataNode);
}

(5)删除数据

STATUS _delete_data(LINK_NODE** pNode, int value)
{LINK_NODE* pLinkNode;if(NULL == (*pNode)->next)return FALSE;pLinkNode = (*pNode)->next;if(value == pLinkNode->data){(*pNode)->next = pLinkNode->next;free(pLinkNode);return TRUE;}else{return _delete_data(&(*pNode)->next, value);}
}STATUS delete_data(LINK_NODE** pNode, int value)
{LINK_NODE* pLinkNode;if(NULL == pNode || NULL == *pNode)return FALSE;if(value == (*pNode)->data){pLinkNode = *pNode;*pNode = pLinkNode->next;free(pLinkNode);return TRUE;}       return _delete_data(pNode, value);
}

(6)查找数据

LINK_NODE* find_data(const LINK_NODE* pLinkNode, int value)
{if(NULL == pLinkNode)return NULL;if(value == pLinkNode->data)return (LINK_NODE*)pLinkNode;return find_data(pLinkNode->next, value);
}

(7)打印数据

void print_node(const LINK_NODE* pLinkNode)
{if(pLinkNode){printf("%d\n", pLinkNode->data);print_node(pLinkNode->next);}
}

(8)统计数据

int count_node(const LINK_NODE* pLinkNode)
{if(NULL == pLinkNode)return 0;return 1 + count_node(pLinkNode->next);
}

【预告: 下一篇博客介绍双向链表】

一步一步写算法(之单向链表)相关推荐

  1. C语言随笔小算法:单向链表

    C语言随笔小算法:单向链表 参考链接: 代码参考:https://blog.csdn.net/go_sann/article/details/80508284 原理参考:https://blog.cs ...

  2. 一步一步写算法(之链表逆转)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 链表逆转是面试环境中经常遇到的一道题目,也是我们在实际开发中可能会遇到的开发需求.和线性逆转不 ...

  3. java 快速从树节点找到数据_数据结构与算法:单向链表和双向链表

    一.链表简介 1.链表概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列节点组成,节点可以在运行时动态生成,节点包括两个部分:一个 ...

  4. node 获取表单数据 为空_数据结构与算法(python)单向链表篇

    链表 数据表的构建需要预先知道数据的大小来申请连续的存储空间, 而在进行扩充的时候又需要进行数据的搬迁, 使用起来不是很灵活. 链表结构可以充分利用计算机内存空间, 实现灵活的内存动态管理. 简单来说 ...

  5. Java数据结构与算法-SingleLinkedList单向链表插入,删除,查找,修改详解及代码

    SingleLinkedList单向链表插入,删除,查找,修改详解及代码 单向链表学习目标 1. 链表的介绍 2. 单向链表的存储特点以及原理 3. 基本操作:插入,删除等 4. 单向链表应用场景举例 ...

  6. python数据结构与算法:单向链表

    单链表:python实现及其对应的 增删查检 操作 ##################### P4.1-P4.8 单向链表 ########################### #coding:u ...

  7. 一步一步写算法(之链表排序)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较线性表的排序而言,链表排序的内容稍微麻烦一点.一方面,你要考虑数据插入的步骤:另外一方面 ...

  8. 一步一步写算法(之链表重合)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 链表重合是一个好玩的问题.原题目是这样的:有两个链表,那么如何判断这两个链表是不是重合的?至于 ...

  9. python单链表逆序_C语言实现一个单向链表,并写程序把单向链表进行逆序?

    上图是题目需要实现的效果. 纯小白才开始学C语言,求指导,只输出了0到9,不知如何逆序输出. 中间重复的代码部分应该是要优化一下的,但暂时还不知到该怎么写. #import typedef struc ...

  10. 【数据结构与算法】单向链表的实现

最新文章

  1. Android开发技术周报 Issue#52
  2. 20190101.DDD笔记
  3. C# webservice调用方法总结
  4. ASP.NET Core 和 Blazor 更新
  5. Digits of Factorial LightOJ - 1045(数学题?)
  6. 关于忘记SYSKEY密码后清除密码操作
  7. 20141214--C#父类,子类
  8. 三思笔记,涂抹ORACLE
  9. [索引汇总帖] 【eoeAndroid社区索引】Cocos2d-x部分汇总 [转贴]
  10. 计算机c盘用户里的APPDATA,什么是appdata C盘appdata可以删除吗
  11. Mac谷歌浏览器chromedriver驱动安装教程,实现浏览器自动化
  12. 详细剖析市面手机基带/射频/处理器配置, 比较各家手机性能
  13. 台币nbsp;日元nbsp;没有小数位问题
  14. 万邦淘宝/天猫获得淘宝商品评论 API 返回值说明
  15. 如何制作u盘pe启动盘?
  16. 使用浏览器转化ASCII码为字符
  17. 冯诺依曼体系各硬件工作原理解析
  18. c语言莹源码,exp5/wc/client.c · 张雪莹20175227/ISSDF - Gitee.com
  19. Spring AOP 原理 (面试必备)
  20. 陨算计算机技术有限公司,扒一扒,变压器空损损耗有多少? 又是如何计算的?...

热门文章

  1. ffmbc——广播电视以及专业用途量身定制的FFmpeg
  2. edge 浏览器中数字显示为链接
  3. 二、Android应用的界面编程(六)ProgressBar及其子类[SeekBar、RatingBar]er
  4. 了解 64 位 Office
  5. uni-app,v-for时 block 和 view 的使用
  6. ssh整合,明明已经导入包,却总是有很多ClassNotFoundException
  7. CTSC2017酱油记
  8. 实验一 框架的选择及其原因
  9. SQL Server时间粒度系列----第9节时间粒度示例演示
  10. Android 自定义View -- 简约的折线图