双向循环链表
来源:互联网 发布:linux 宕机日志 编辑:程序博客网 时间:2024/06/11 22:47
转载请注明原文地址:http://blog.csdn.net/oyhb_1992/article/details/77093452
01.#include<stdio.h> 02.#include<malloc.h> 03.#include<stdlib.h> 04. 05.#define MALLOC(name,type1,type2)\ 06. if(!((name) = (type1)malloc(sizeof(type2)))){\ 07. fprintf(stderr,"Insufficient_memmory");\ 08. exit(EXIT_FAILURE);\ 09. } 10. 11.typedef enum {OK,ERROR}Status; 12.typedef enum{false,true}bool; 13.typedef int elemtype; 14.typedef struct Node* lInkedlist; 15.struct Node{ 16. elemtype data; 17. struct Node* next; 18. struct Node* prior; 19.}; 20. 21.lInkedlist Listinit(lInkedlist head); 26.unsigned int Listlength(lInkedlist head); 32.unsigned int Listlocate(lInkedlist head,elemtype e); 37.Status Listinsert(lInkedlist N,elemtype e); 43.Status Listdelete(lInkedlist head,lInkedlist N); 48.void Listtraverse(lInkedlist head); 52.bool Listempty(lInkedlist head); 56.Status Listdestory(lInkedlist head); 60.lInkedlist Listinit(lInkedlist head){ 61. MALLOC(head,lInkedlist,struct Node); 62. head->prior = head; /*前后节点指针都指向首节点内存地址*/63. head->next = head; 64. return head; 65.} 66. 67. 68.unsigned int Listlength(lInkedlist head){ 69. unsigned int length = 0; 70. lInkedlist temp = head->next; 71. 72. for(;temp != head;temp = temp->next){ 73. length++; 74. } 75. return length; 76.} 77. 78. /*首节点是0,下一个节点是1*/ 79.unsigned int Listlocate(lInkedlist head,elemtype e){ 80. unsigned int count = 0; 81. lInkedlist temp = head->next; 82. for(;temp != head;temp = temp->next){ 83. count++; 84. if(e == temp->data){ 85. return count; 86. } 87. 88. } 89. printf("链表中不存在该元素"); 90. return 0; 91.} 92./*随便在一个节点N插入新节点,写代码不论是插入还是删除节点精髓都在于每一个节点的前后指针都要指向其他节点的内存起始位置*/ 93.Status Listinsert(lInkedlist N,elemtype e){ 94. lInkedlist temp; 95. MALLOC(temp,lInkedlist,struct Node); 96. temp->data = e; 97. 98. N->next->prior = temp; 99. temp->next = N->next; 100. temp->prior = N; 101. N->next = temp; 102. 103. return OK; 104.} 105. 106. 107.Status Listdelete(lInkedlist head,lInkedlist N){ 108. if(N==head){ 109. return ERROR; 110. } 111. 112. N->next->prior = N->prior; 113. N->prior->next = N->next; 114. 115. free(N); 116. N = NULL; 117. 118. return OK; 119.} 120. 121. /*遍历打印链表中数据数据*/ 122.void Listtraverse(lInkedlist head){ 123. lInkedlist temp = head->next; 124. if(head == NULL){ 125. printf("链表为空"); 126. } 127. for(;temp != head;temp = temp->next){ 128. printf("%d\n",temp->data); 129. } 130.} 131. 132.bool Listempty(lInkedlist head){ 133. if(head = head->next){ 134. return true; 135. } 136. else return false; 137.} 138. 139.Status Listdestory(lInkedlist head){ 140. lInkedlist temp = head->next; 141. lInkedlist p; 142. while(temp!=head){ 143. p = temp; 144. temp = temp->next; 145. free(p); 146. } 147. free(head);/*最后释放头节点内存*/ 148. free(temp);/*这句话感觉多余*/149. head = NULL; 150. temp = NULL; 151. 152. return OK; 153.}
双向循环链表:如果是空链表时则首节点的上一个节点指针,下一个节点指针都是指向首节点的内存地址的。
如果不是空链表时,那么首节点的前一个节点指针指向尾节点的内存地址。尾节点的下一个节点指针指向首节点的内存地址。
阅读全文
1 0
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 双向循环链表
- 循环双向链表
- 简单记录spring在控制台向页面传參的几种方法
- Linux 常用查看日志命令
- 图像语义分割(1)- FCN
- centos7搭建hadoop集群
- Map四种遍历方式以及增删改查方法总结
- 双向循环链表
- 通过反编译深入理解Java String及intern
- 重写PrineArea解决打印空白页问题
- Hdu6048 Puzzle(2017多校第2场)
- Android Tablayout+ViewPager使用及遇到的问题
- ffmpeg 返回错误数字含义
- notepad源码windows下编译教程(基于版本7.4.2)
- Android动态获取权限
- Qt之QTcpServer/QTcpSocket简单收发信息