DBLinkedList.cpp
上传用户:smdfuse
上传日期:2015-11-06
资源大小:98k
文件大小:4k
源码类别:

图形图象

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "DBLinkedList.h"
  3. #include "stdlib.h"
  4. Node::Node():avai(false),next(NULL),previous(NULL){
  5. // 数据置空
  6. nodedata.data = NULL;
  7. nodedata.size = 0;
  8. }
  9. Node::Node(void *_info,int size, Node *_next,Node *_previous):
  10. next(_next),previous(_previous),avai(true){
  11. nodedata.data = malloc(size);      // 数据内存空间
  12. memcpy(nodedata.data,_info,size);
  13. nodedata.size = size;
  14. }
  15. Node::~Node(){
  16. // 释放数据内存空间
  17. free(nodedata.data);
  18. }
  19. void * Node::GetInfo(){
  20. return nodedata.data;
  21. }
  22. void Node::SetInfo(void *info,int size){
  23. //this->info = info;
  24. if(this->nodedata.data != NULL)
  25. free(nodedata.data);
  26. // 数据拷贝
  27. nodedata.data = malloc(size);
  28. memcpy(nodedata.data,info,size);
  29. }
  30. void Node::SetNext(Node *next){
  31. this->next = next;
  32. }
  33. void Node::SetPrevious(Node *previous){
  34. this->previous = previous;
  35. }
  36. Node* Node::GetPrevious(){
  37. return this->previous;
  38. }
  39. Node* Node::GetNext(){
  40. return this->next;
  41. }
  42. bool Node::GetAvai(){
  43. return this->avai;
  44. }
  45. DBLinkedList::DBLinkedList():head(NULL),rear(NULL),currentPtr(NULL){
  46. head = NULL;
  47. rear = NULL;
  48. }
  49. DBLinkedList::~DBLinkedList(){
  50. Destory();
  51. }
  52. // 最加数据
  53. bool DBLinkedList::Append(void *info,int size){
  54. if(head == NULL){
  55. head = new Node(info,size,NULL,NULL);
  56. rear = head;
  57. currentPtr = head;
  58. }else{
  59. rear->SetNext(new Node(info,size,NULL,rear));
  60. rear = rear->GetNext();
  61. }
  62. return true;
  63. }
  64. // 插入数据
  65. // last是前一个指针
  66. bool DBLinkedList::Add(void *info,int size,Node* last){
  67. // 如果是最后一个元素
  68. if(last == NULL || last == rear || head == NULL){
  69. this->Append(info,size);
  70. return true;
  71. }
  72. Node* next = last->GetNext();
  73. last->SetNext(new Node(info,size,next,last));
  74. if(next != NULL)
  75. next->SetPrevious(last->GetNext());
  76. if(this->rear == last){
  77. rear = last->GetNext();
  78. }
  79. return true;
  80. }
  81. bool DBLinkedList::Delete(Node *curr){
  82. if(curr == NULL)
  83. return false;
  84. // 如果只有一个元素
  85. if(curr->GetPrevious() == NULL && curr->GetNext() == NULL){
  86. //如果是第一个元素删除,或者唯一一个元素
  87. head = NULL;
  88. rear = NULL;
  89. delete curr;
  90. return true;
  91. }
  92. // 如果删除的是第一个元素
  93. if(curr->GetPrevious() == NULL){
  94. // 取得下一个元素
  95. head = curr->GetNext();
  96. head->SetPrevious(NULL);
  97. delete curr;
  98. return true;
  99. }
  100. // 如果删除的是最后一个元素
  101. if(curr->GetNext() == NULL){
  102. // 如果删除的是最后一个元素
  103. rear = curr->GetPrevious();
  104. rear->SetNext(NULL);
  105. delete curr;
  106. return true;
  107. }
  108. // 如果删除的是中间元素
  109. if(curr->GetNext() != NULL && curr->GetPrevious() != NULL)
  110. {
  111. // 如果删除的是中间的元素
  112. Node * previous = curr->GetPrevious();
  113. Node * next = curr->GetNext();
  114. delete curr;
  115. previous->SetNext(next);
  116. next->SetPrevious(previous);
  117. return true;
  118. }
  119. return true;
  120. }
  121. void* DBLinkedList::GetInfo(Node *node){
  122. return node->GetInfo();
  123. }
  124. Node* DBLinkedList::GetNext(){
  125. return currentPtr->GetNext();
  126. }
  127. Node* DBLinkedList::GetPrevious(){
  128. return currentPtr->GetNext();
  129. }
  130. Node* DBLinkedList::GetCurrent(){
  131. return currentPtr;
  132. }
  133. void* DBLinkedList::GetCurrentInfo(){
  134. if(currentPtr == NULL) return NULL;
  135. return currentPtr->GetInfo();
  136. }
  137. void* DBLinkedList::GetNextInfo(){
  138. currentPtr = currentPtr->GetNext();
  139. if(currentPtr == NULL){
  140. currentPtr = head;
  141. return NULL;
  142. }
  143. return currentPtr->GetInfo();
  144. }
  145. void * DBLinkedList::GetPreviousInfo(){
  146. currentPtr = currentPtr->GetPrevious();
  147. if(currentPtr == NULL){
  148. currentPtr = rear;
  149. return NULL;
  150. }
  151. return currentPtr->GetInfo();
  152. }
  153. /*
  154. * 函数:Destory 
  155. * 功能:销毁
  156. */
  157. void DBLinkedList::Destory(){
  158. //遍历
  159. Node *curr = head;
  160. Node *next = NULL;
  161. if(head != NULL)
  162. next = head->GetNext();
  163. else 
  164. return;
  165. for(;curr != NULL;curr = next){
  166. next = curr->GetNext();
  167. delete curr;
  168. }
  169. head = NULL;
  170. rear = NULL;
  171. }
  172. /*
  173. * 函数: ResetCurrentPtr
  174. * 功能: 重新设置CurrentPtr的位置到头或者尾
  175. */
  176. void DBLinkedList::ResetCurrentPtr(bool head){
  177. if(head){
  178. currentPtr = this->head;
  179. }else{
  180. currentPtr = rear;
  181. }
  182. }
  183. /*
  184. * GetLastInfo
  185. * 功能:获得表末尾的数据
  186. */
  187. void *DBLinkedList::GetLastInfo(){
  188. if(rear != NULL)
  189. return rear->GetInfo();
  190. return NULL;
  191. }
  192. /*
  193. *  DeleteLast
  194. * 功能:删除最后一个位置的节点
  195. */
  196. bool DBLinkedList::DeleteLast(){
  197. return this->Delete(this->rear);
  198. }