1. //链表的基本用法代码实现
    /************************************************************************/
  2. /* Created: 2014-03-02
  3. /* Author: http://weibo.com/3088919800/profile
  4. /************************************************************************/
  5.  
  6. #include "stdio.h"
  7. #include "stdlib.h"
  8.  
  9. struct ListNode
  10. {
  11. int value;
  12. ListNode * next;
  13. };
  14.  
  15. ListNode* CreateListNode(const int& nNodeValue)
  16. {
  17. ListNode* pNode;
  18.  
  19. pNode = (ListNode*)malloc(sizeof(ListNode));
  20. if (!pNode)
  21. return NULL;
  22.  
  23. pNode->value = nNodeValue;
  24. pNode->next = NULL;
  25. return pNode;
  26. }
  27.  
  28. //we need the head node value.
  29. ListNode * CreateList(const int& nListHeadVal)
  30. {
  31. ListNode * li;
  32. li = CreateListNode(nListHeadVal);
  33. if (!li)
  34. return NULL;
  35. return li;
  36. }
  37.  
  38. //free all nodes in the list
  39. void FreeList(ListNode *li)
  40. {
  41. ListNode * pListNode, *pTmpNode;
  42. pListNode = li;
  43. while (pListNode)
  44. {
  45. pTmpNode = pListNode;
  46. pListNode = pListNode->next;
  47. free(pTmpNode);
  48. }
  49. li = NULL;
  50. }
  51.  
  52. ListNode* AppendNode(ListNode* pList, const int &nVal)
  53. {
  54. ListNode* node;
  55. ListNode* header;
  56.  
  57. node = CreateListNode(nVal);
  58.  
  59. if (!node)
  60. return pList;
  61.  
  62. header = pList;
  63. if (!header)
  64. return node;
  65.  
  66. header = pList;
  67.  
  68. while(header->next)
  69. header = header->next;
  70.  
  71. header->next = node;
  72.  
  73. return pList;
  74. }
  75.  
  76. //if find return the node, else return null
  77. ListNode* Find(ListNode* pList, const int& nVal)
  78. {
  79. ListNode* pListNode = NULL;
  80.  
  81. pListNode = pList;
  82.  
  83. while (pListNode)
  84. {
  85. if (pListNode->value == nVal)
  86. break;
  87. pListNode = pListNode->next;
  88. }
  89.  
  90. return pListNode;
  91. }
  92.  
  93. //insert decreasing 增减
  94. ListNode* Insert(ListNode* pList, const int& nVal)
  95. {
  96.  
  97. ListNode * pNewNode = NULL;
  98. ListNode* pIterNode = NULL;
  99.  
  100. pNewNode = CreateListNode(nVal);
  101. if (!pNewNode)
  102. return pList;
  103.  
  104. if (!pList)
  105. return pNewNode;
  106.  
  107. pIterNode = pList;
  108. while (pIterNode->value > nVal && pIterNode->next && pIterNode->next->value > nVal)
  109. pIterNode = pIterNode->next;
  110.  
  111. //if true ,it is the first node
  112. if (pIterNode->value <= nVal)
  113. {
  114. pNewNode->next = pIterNode;
  115. return pNewNode;
  116. }
  117.  
  118. if (pIterNode->next)
  119. pNewNode->next = pIterNode->next;
  120.  
  121. pIterNode->next = pNewNode;
  122.  
  123. return pList;
  124. }
  125.  
  126. //insert Ascending,递增
  127. ListNode* Insert2(ListNode* pList, const int& nVal)
  128. {
  129.  
  130. ListNode * pNewNode = NULL;
  131. ListNode* pIterNode = NULL;
  132.  
  133. pNewNode = CreateListNode(nVal);
  134. if (!pNewNode)
  135. return pList;
  136.  
  137. if (!pList)
  138. return pNewNode;
  139.  
  140. pIterNode = pList;
  141.  
  142. while (pIterNode->value < nVal && pIterNode->next && pIterNode->next->value < nVal)
  143. pIterNode= pIterNode->next;
  144.  
  145. //if true ,it is the first node
  146. if (pIterNode->value > nVal)
  147. {
  148. pNewNode->next = pIterNode;
  149. return pNewNode;
  150. }
  151.  
  152. // insert the node.
  153. if (pIterNode->next)
  154. pNewNode->next = pIterNode->next;
  155. pIterNode->next = pNewNode;
  156. return pList;
  157. }
  158.  
  159. void PrintList(ListNode* list)
  160. {
  161. ListNode* pIterNode;
  162.  
  163. pIterNode = list;
  164. while (pIterNode)
  165. {
  166. printf("%d ", pIterNode->value);
  167. pIterNode = pIterNode->next;
  168. }
  169. }
  170. //链表倒置
  171. ListNode* InvertList(ListNode* list)
  172. {
  173. ListNode *pIterNode, *pNewHead, *pTmpNode;
  174.  
  175. pTmpNode = list;
  176. if (!pTmpNode || !(pTmpNode->next))
  177. return list;
  178.  
  179. pNewHead = list;
  180. pIterNode = list;
  181.  
  182. while(pIterNode->next)
  183. {
  184. pTmpNode = pIterNode->next->next;
  185. pIterNode->next->next = pNewHead;
  186. pNewHead = pIterNode->next;
  187. pIterNode->next = pTmpNode;
  188. }
  189.  
  190. return pNewHead;
  191. }
  192.  
  193. int main(int argc, char* argv[])
  194. {
  195. ListNode* list = CreateList();
  196.  
  197. ListNode* pNode;
  198. if (!list)
  199. {
  200. printf("create list error!");
  201. exit(-);
  202. }
  203.  
  204. int i = ;
  205.  
  206. for (int i = ; i< ; i++)
  207. {
  208. list = Insert2(list, i);
  209. }
  210.  
  211. printf("\nAfter insert list: \n");
  212. PrintList(list);
  213.  
  214. list = InvertList(list);
  215. printf("\nAfter invert the list\n");
  216. PrintList(list);
  217.  
  218. //test find .
  219. pNode = Find(list, );
  220. if (pNode)
  221. {
  222. printf("\nfind it:%d\n", pNode->value);
  223. }
  224. else
  225. {
  226. printf("\nnot find it:%d\n", );
  227. }
  228.  
  229. //free all the list node
  230. FreeList(list);
  231.  
  232. getchar();
  233. return ;
  234. }

c/c++ 链表实现的更多相关文章

  1. Redis链表实现

    链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层 ...

  2. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  3. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  4. 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结

    防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...

  5. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  6. C语言之链表list

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

  7. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  8. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  9. 用JavaScript来实现链表LinkedList

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...

  10. 数据结构:队列 链表,顺序表和循环顺序表实现(python版)

    链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...

随机推荐

  1. Test测试方法

    Junit 注解 解释 @Before 在每个测试方法运行前执行的方法 @After 在每个测试方法运行后执行的方法 @BeforeClass 在类中所有测试运行之前运行的方法 @AfterClass ...

  2. k8spod控制器概述

    自主式pod对象由调度器绑定至目标工作节点后即由相应节点上的kubelet负责监控其容器的存活性,容器主进程崩溃后,kubelet能够自动重启相应的容器.不过,kubelet对非主进程崩溃类的容器错误 ...

  3. JAVA基础编程之打印99乘法表

    需求:打印9*9乘法表 技术考核: 1.for嵌套循环 代码: // 打印99乘法表 public static void print99Table() { System.out.println(&q ...

  4. 【leetcode】1266. Minimum Time Visiting All Points

    题目如下: On a plane there are n points with integer coordinates points[i] = [xi, yi]. Your task is to f ...

  5. Python CGI编程Ⅵ

    GET和POST方法 浏览器客户端通过两种方法向服务器传递信息,这两种方法就是 GET 方法和 POST 方法. 使用GET方法传输数据 GET方法发送编码后的用户信息到服务端,数据信息包含在请求页面 ...

  6. python from…import* 语句

    把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明: from modname import * 这提供了一个简单的方法来导入一个模块中的所有项目.然而这种声明不该被过多地使用. ...

  7. BZOJ 2434: [Noi2011]阿狸的打字机 AC自动机+fail树+线段树

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...

  8. CF603E Pastoral Oddities 优先队列+结论+LCT维护生成树

    首先,一个神奇的结论:一个合法的方案存在的条件是每一个联通块的节点数都是偶数个的. 这个可以用数学归纳法简单证一证. 证出这个后,我们只需动态加入每一个边,并查看一下有哪些边能够被删除(删掉后联通块依 ...

  9. idea maven projects 工具栏按钮的作用

    1.Execute Maven Goal  弹出可执行的 Maven 命令的输入框.有些情况下我们需要通过书写某些执行命令来构建项目,就可以通过此按钮 2.Toggle Offline Mode 英文 ...

  10. R_Studio(神经网络)BP神经网络算法预测销量的高低

    BP神经网络 百度百科:传送门 BP(back propagation)神经网络:一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络 #设置文件工作区间 setwd('D:\\ ...