1. /*****************************************************
  2. Author:Simon_Kly Version:0.1 Date: 20170520
  3. Description:带头结点的双向循环链表
  4. Mail: degaullekong@gmail.com
  5. Funcion List:
  6. *****************************************************/
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10.  
  11. typedef struct node
  12. {
  13. int data;
  14. struct node *prior, *next;
  15. }Node, *Link;
  16.  
  17. void is_malloc_ok(Link head)
  18. {
  19. if (head == NULL)
  20. {
  21. printf("malloc is error!\n");
  22. exit(-);
  23. }
  24. }
  25.  
  26. /*创建链表*/
  27. void create_link(Link * head)
  28. {
  29. *head = (Link)malloc(sizeof(Node));
  30.  
  31. is_malloc_ok(*head);
  32.  
  33. (*head)->next = (*head)->prior = *head;//让其指向自己
  34. }
  35.  
  36. /*创建节点*/
  37. void create_node(Link * new_node)
  38. {
  39. *new_node = (Link)malloc(sizeof(Node));
  40. is_malloc_ok(*new_node);
  41. }
  42.  
  43. /*插入节点(头插)*/
  44. void insert_node_head(Link head, Link new_node)
  45. {
  46. new_node->prior = head;
  47. new_node->next = (head)->next;
  48. (head)->next->prior = new_node;
  49. (head)->next = new_node;
  50. }
  51.  
  52. /*插入节点(尾插)*/
  53. void insert_node(Link * head, Link new_node)
  54. {
  55. Link p = NULL;
  56.  
  57. p = *head;
  58. while (p->next != *head)
  59. {
  60. p = p->next;
  61. }
  62.  
  63. new_node->prior = p;
  64. new_node->next = p->next;
  65. p->next->prior = new_node;
  66. p->next = new_node;
  67. }
  68.  
  69. /*输出链表*/
  70. void out_link(Link head)
  71. {
  72. Link p = NULL;
  73. #if 0
  74. if (head->next == head)
  75. {
  76. printf("link is empty\n");
  77. return ;
  78. }
  79. #endif
  80.  
  81. if (head == NULL)
  82. {
  83. printf("link is empty\n");
  84. return ;
  85. }
  86.  
  87. p = (head)->next;
  88.  
  89. while (p != head)
  90. {
  91. printf("%d\n", p->data);
  92. p = p->next;
  93. }
  94. putchar();
  95. }
  96.  
  97. /*变成空链*/
  98. void make_empty(Link * head)
  99. {
  100. Link p = NULL;
  101.  
  102. p = (*head)->next;
  103.  
  104. while (*head != (*head)->next)
  105. {
  106. (*head)->next = p->next;//head移动
  107. free(p);//释放head之前的节点
  108. p = (*head)->next;
  109. }
  110. }
  111.  
  112. /*释放链表*/
  113. void release_link(Link * head)
  114. {
  115. make_empty(head);
  116.  
  117. free(*head);
  118.  
  119. *head = NULL;
  120. }
  121.  
  122. /*删除节点*/
  123. void delete_node(Link * head, int data)
  124. {
  125. Link p = NULL;
  126.  
  127. p = (*head)->next;
  128.  
  129. if (p == *head)//空链
  130. {
  131. printf("link is empty!\n");
  132. return ;
  133. }
  134.  
  135. /*非空链*/
  136. while (p != *head && p->data != data)
  137. {
  138. p = p->next;//找那个节点
  139. }
  140.  
  141. if (p == *head)//找一圈没找到
  142. {
  143. printf("No such node!\n");
  144. return ;
  145. }
  146. else//找到并改变指向
  147. {
  148. p->prior->next = p->next;
  149. p->next->prior = p->prior;
  150.  
  151. free(p);
  152. }
  153. }
  154.  
  155. void insert_node_seq(Link * head, Link new_node)
  156. {
  157. Link p = NULL;
  158.  
  159. p = (*head);
  160.  
  161. while (p->next != *head && new_node->data < p->next->data)//找到该位置的前一个位置
  162. {
  163. p = p->next;
  164. }
  165. #if 0
  166. if (p == *head)//找到尾部
  167. {
  168. new_node->prior = p->prior;
  169. new_node->next = p;
  170. p->prior->next = new_node;
  171. p->prior = new_node;
  172. return ;
  173. }
  174. #endif
  175. new_node->prior = p;
  176. new_node->next = p->next;
  177. p->next->prior = new_node;
  178. p->next = new_node;
  179.  
  180. }
  181.  
  182. int main()
  183. {
  184. int i;
  185. Link head = NULL;
  186. Link new_node = NULL;
  187. create_link(&head);
  188.  
  189. out_link(head);
  190.  
  191. for (i = ; i < ; i++)
  192. {
  193. create_node(&new_node);
  194. new_node->data = i + ;
  195. // insert_node(&head, new_node);
  196. insert_node_head(head, new_node);
  197. }
  198.  
  199. out_link(head);
  200.  
  201. #if 1
  202. printf("please input i\n");
  203. scanf("%d", &i);
  204. putchar();
  205. create_node(&new_node);
  206. new_node->data = i;
  207. insert_node_seq(&head, new_node);
  208. out_link(head);
  209. #endif
  210.  
  211. #if 0
  212. delete_node(&head, );
  213. out_link(head);
  214. #endif
  215. release_link(&head);
  216. out_link(head);
  217. return ;
  218. }

带头结点的双向循环链表----------C语言的更多相关文章

  1. 一种神奇的双向循环链表C语言实现

    最近在看ucore操作系统的实验指导.里面提要一个双向循环链表的数据结构,挺有意思的. 其实这个数据结构本身并不复杂.在普通链表的基础上加一个前向指针,我们就得到了双向链表,再把头尾节点连起来就是双向 ...

  2. 不带头结点的单链表------C语言实现

    File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion L ...

  3. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

  4. c语言双向循环链表

    双向循环链表,先来说说双向链表,双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继 ...

  5. C++实现双向循环链表

    本次博文是关于利用C++模板的方式实现的双向循环链表以及双向循环链表的基本操作,在之前的博文C++语言实现双向链表中,已经给大家分析了双向循环链表的结构,并以图示的方式给大家解释了双向循环链表的基本操 ...

  6. java数据结构-06双向循环链表

    双向循环链表跟单向链表一样,都是头尾相连,不过单向是尾指向头,双向是头尾互相指,可以从前往后查,也可以从后往前查 无头结点的双向循环链表 public class CircleLinkedList&l ...

  7. 【C语言教程】“双向循环链表”学习总结和C语言代码实现!

    双向循环链表 定义 双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表.只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿 ...

  8. 双向循环链表(C语言描述)(四)

    下面以一个电子英汉词典程序(以下简称电子词典)为例,应用双向循环链表.分离数据结构,可以使逻辑代码独立于数据结构操作代码,程序结构更清晰,代码更简洁:电子词典的增.删.查.改操作分别对应于链表的插入. ...

  9. 双向循环链表(C语言描述)(一)

    双向循环链表是链表的一种,它的每个节点也包含数据域和指针域.为了方便程序维护,可以单独为数据域定义一种数据类型,这里以整型为例: typedef int LinkedListData; 双向循环链表( ...

随机推荐

  1. vue中引入路由,如果你懒得写那么

    可以npm i vue-router --save,项目中自动给你写好,vuex也可以

  2. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)

    传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...

  3. [CSP-S模拟测试]:简单的填数(贪心+模拟)

    题目描述 对于一个长度为$n$,且下标从$1$开始编号的序列$a$,我们定义它是「合法的」,当且仅当它满足以下条件:·$a_1=1$·对于$i\in [1,n),a_i\leqslant a_{i+1 ...

  4. FFMpeg视频解码初探

    在视频解码前,先了解以下几个基本的概念: 编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分. 容器/多媒体文件(Container/File):没有了解 ...

  5. Apache2.2+mod_encoding解决URL中文编码问题

    我们经常在论坛上看到这样的求救贴: 为什么我看不了网站上中文文件名的文件?这时一定会有好心的大侠告诉说,到IE6的工具,Internet选项, 高级里,把"总是以UTF-8发送URL&quo ...

  6. 3.Jmeter 快速入门教程(三-1) --添加响应断言(即loadrunner中所指的检查点)

    上一节课,我们创建了一个测试场景,并进行了少量vuser的负载测试. 有时候我们执行了测试,但是发现并不是所有事务都执行成功了. 那是因为我们只是发起了测试,但并没有对每次请求测试的返回作校验. 所以 ...

  7. 用Emacs进行Python开发

    用Emacs进行Python开发 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} ...

  8. java性能调优02

    1.字符串优化处理 1.1 常量池的优化:当String对象拥有相同的值时,他们只引用常量池的同一个拷贝. String a="123"; String b="123&q ...

  9. Day1 - 认识大数据& 企业需求分析 & 北风网简介

    上午: 介绍: 海量的乱七八糟的数据中快速的计算出某些有用的信息 刑侦视频追踪 云栖大会 大数据分析/挖掘 ==>  python  <== 重点关注 大数据运维   ==> 运服务 ...

  10. 【Elasticsearch 7 探索之路】(六)初识 Mapping

    上一篇主要讲解什么是 URL Search 和 Request Body Search 的语法.本篇对 Mapping 的 Dynamic Mapping 以及手动创建 Mapping 进行讲解. 1 ...