【 声明:版权所有所有。欢迎转载,不用于商业用途。  联系我们: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. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  2. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  3. 一步一步写算法(之寻找丢失的数)

    一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...

  4. 一步一步写算法(之克鲁斯卡尔算法 中)

    一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到 ...

  5. 一步一步写算法(之prim算法 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...

  6. 一步一步写算法(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...

  7. 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)

    原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...

  8. 一步一步写算法(之排序二叉树删除-1)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每 ...

  9. 一步一步写算法(之排序二叉树删除-3)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 3 普通节点的删除 3.1 删除的节点没有左子树,也没有右子树 测试用例1: 删除节点6 /* ...

  10. 教你一步一步用C语言实现sift算法、上

    原文:http://blog.csdn.net/v_july_v/article/details/6245939 引言:     在我写的关于sift算法的前倆篇文章里头,已经对sift算法有了初步的 ...

最新文章

  1. 反编译android的apk
  2. OpenCV使用MSER检测末端区域的实例(附完整代码)
  3. 使用 Apache Atlas 进行数据治理
  4. 数据库常用增删改查记录等语句
  5. Git之cherry-pick命令
  6. 使用C语言--判断素数的两种方法
  7. C语言关键字浅析-char
  8. plcst语言编程教程_PLC初学者如何从梯形图过渡到ST语言编程
  9. android好用的窗口小工具下载,股票窗口小工具,安卓股票小插件
  10. Pytorch将数据集划分为训练集、验证集和测试集
  11. [MRI]核磁共振头线圈和体线圈
  12. Android开发:基站定位
  13. 成功解决ValueError: Only TF native optimizers are supported in Eager mode
  14. 赛码-回文串-java
  15. 天梵古法健康知识普及:手少阴心经经穴
  16. 什么是阿尔法(Alpha)收益、贝塔(Beta)收益
  17. 身份实名认证增强版API开发文档
  18. C51单片机-串行口2-蓝牙模块-应用例程
  19. 扫雷游戏开发基本思路
  20. 有哪些手机软件支持一键拼图?这几款软件亲测实用

热门文章

  1. 再说spring比较重,臃肿的看此文!!!!!
  2. 【中文】Joomla1.7扩展介绍之Kunena(强大的论坛)
  3. 一种新的验证码(改进版)
  4. 上海技术英雄会续:几个典型问题的看法
  5. [歌曲]心愿(by 四个女生)
  6. C语言博客作业--函数嵌套调用
  7. 操纵BGP AS-PATH 属性案例(配图+详细验证过程)
  8. 如何在require中使用VUE
  9. Marcin Grzejszczak访谈:Spring Cloud Contract
  10. java 泛型 窜讲