Advertisement
Loloped

Двунаправленный список стр.64

Jun 15th, 2013
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.54 KB | None | 0 0
  1. //Двунаправленный список стр.64
  2.  
  3. #include "exception.cpp"
  4. template <class Item>
  5. class DoubleLinkedList
  6. {
  7. struct Element
  8. {
  9. Item inf;
  10. Element *next;
  11. Element *prev;
  12. Element (Item x):inf(x), next(0), prev(0)
  13. {}
  14. };
  15. Element *head;
  16. Element *tail;
  17. int size;
  18. //возвращает указатель на элемент списка с номером index
  19. Element *Find (int index)
  20. {
  21. if ((index<1)||(index>size))
  22. {
  23. return NULL;
  24. }
  25. else
  26. {
  27. Element *cur=head;
  28. for (int i=1;i<index;i++)
  29. {
  30. cur=cur->next;
  31. }
  32. return cur;
  33. }
  34. }
  35. public:
  36. DoubleLinkedList():head(0), tail(0), size(0) //конструктор
  37. {}
  38. ~DoubleLinkedList() //деструктор
  39. { while (!Empty())
  40. { Remove(1);}
  41. }
  42. bool Empty() //проверяет список на пустоту
  43. {returnhead==0;}
  44. int GetLength() //возвращает количество элементов в списке
  45. {return size;}
  46. //возвращает значение элемента списка по его номеру
  47. Item Get(int index)
  48. {
  49. if ((index<1)||(index>size))
  50. {
  51. throw DoubleListException("Exception: get - double-linked list error");
  52. }
  53. else
  54. {
  55. Element *r=Find(index);
  56. Item i=r->inf;
  57. return i;
  58. }
  59. }
  60. //осуществляет вставку элемента со значением data слева от элемента с позицией index
  61. void InsertLeft(int index, Item data)
  62. {
  63. if ((index<1)||(index>size+1))
  64. {
  65. throw DoubleListException("Exception: insert - double-linked list error");
  66. }
  67. else
  68. {
  69. Element *newPtr=new Element(data);
  70. size=GetLength()+1; //увеличивает размерность списка
  71. //устанавливаем указатель на элемент списка с заданным номером
  72. Element *cur=Find(index);
  73. //если этот указатель NULL, то список был пуст, поэтому новый элемент будет и первым и последним
  74. if (cur==NULL) //см. рис. 5.11
  75. {
  76. head=newPtr;
  77. tail=newPtr;
  78. }
  79. else
  80. //иначе производим вставку в непустой список, при этом есть два случая: 1 - частный случай (вставка перед первым элементом списка), 2 - общий случай
  81. {
  82. newPtr->next=cur;
  83. newPtr->prev=cur->prev;
  84. cur->prev=newPtr;
  85. if (cur==head)
  86. {head=newPtr;} //случай 1
  87. else
  88. {
  89. newPtr->prev->next=newPtr; //случай 2
  90. }
  91. }
  92. }
  93. }
  94. //осуществляет вставку элемента со значением data слева от элемента с позицией index
  95. void insertRight (int index, Item data)
  96. {
  97. if ((index<1&&head!=NULL)||(index>size+1))
  98. { cout<<"Exception: insert - double-linked list error"<<endl; }
  99. else
  100. {
  101. Element *newPtr=new Element(data);
  102. size=GetLength()+1; //увеличиваем размерность списка
  103. //устанавливаем указатель на элемент списка с заданным номером
  104. Element *cur=Find(index);
  105. //если этот указатель NULL, то список был пуст, поэтому новый элемент будет и первым и последним
  106. if (cur==NULL)
  107. {
  108. head=newPtr;
  109. tail=newPtr;
  110. }
  111. else
  112. //иначе производим вставку в непустой список, при этом есть два случая: 1 - вставка после последнего элемента списка, 2 - вставка в середину списка
  113. {
  114. newPtr->new=cur->next;
  115. newPtr->prev=cur;
  116. cur->next=newPtr;
  117. if (cur==tail)
  118. {
  119. tail=newPtr; //случай 1
  120. }
  121. else
  122. { newPtr->new->prev=newPtr; } //случай 2
  123. }
  124. }
  125. }
  126. //осуществляет удаление элемента с номером index из списка
  127. //выделяем четыре случая: 1 - после удаления список становится пустым, 2 - удаляем первый элемент, 3 - удаляем последний элемент, 4 - общий случай
  128. void Remove(int index)
  129. {
  130. if ((index<1)||(index>size))
  131. {
  132. cout<<"Exception: remove - double-linked lisst error");
  133. }
  134. else
  135. {
  136. //устанавливаем указатель на заданный элемент
  137. Element *cur=Find(index);
  138. --size; // уменьшаем размерность списка
  139. if (size==0) //случай 1
  140. {
  141. head = NULL;
  142. tail = NULL;
  143. }
  144. else if (cur==head) //случай 2
  145. {
  146. head=head->next;
  147. head->prev=NULL;
  148. }
  149. else if (cur==tail) //случай 3
  150. {
  151. tail=tail->prev;
  152. tail->next=NULL;
  153. }
  154. else //общий случай, см.рис.5.14
  155. {
  156. cur->prev->next=cur->next;
  157. cur->next->prev=cur->prev;
  158. }
  159. cut->next=NULL;
  160. cur->prev=NULL;
  161. delete cur;
  162. }
  163. }
  164. //вывод элементов списка в глобальный поток out в прямом порядке
  165. void PrintLeftToRight()
  166. {
  167. for (Element *cur = head; cur!=NULL; cur=cur->next)
  168. { out<<cur->inf<<' '; }
  169. out << endl;
  170. }
  171. //вывод элементов списка в глобальный поток out в обратном порядке
  172. void PrintRightToLeft()
  173. {
  174. for (Element *cur=tail; cur!=NULL; cur=cur->prev)
  175. {
  176. out<<cur->inf<<' ';
  177. }
  178. out<<endl;
  179. }
  180. };
  181.  
  182. /* Замечание: Класс DoubleListException помещён в отдельный файл exception.cpp и выглядит следующим образом:
  183. #include "exception"
  184. #include "string"
  185. using namespace std;
  186. class DoubleListException: public exception
  187. {
  188. public:
  189. DoubleListException (const string & message = ""): exception (message.c_str())
  190. {}
  191. }; */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement