Für Vorlesungen, bitte die Webseite verwenden. https://flavigny.de/lecture
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
3.8KB

  1. template<class T>
  2. class DLList {
  3. // das interne Listenelement
  4. struct Element {
  5. Element* next;
  6. Element* prev;
  7. T item;
  8. Element (T &t) {
  9. item = t;
  10. next = prev = 0;
  11. }
  12. };
  13. public:
  14. typedef T MemberType; // Merke Grundtyp
  15. // der iterator kapselt Zeiger auf Listenelement
  16. class Iterator {
  17. private:
  18. Element* p;
  19. public:
  20. Iterator () { p=0; }
  21. Iterator (Element* q) { p=q; }
  22. bool operator!= (Iterator x) {
  23. return p!=x.p;
  24. }
  25. bool operator== (Iterator x) {
  26. return p==x.p;
  27. }
  28. Iterator operator++ () { // prefix
  29. p=p->next;
  30. return *this;
  31. }
  32. Iterator operator++ (int) { // postfix
  33. Iterator tmp = *this;
  34. p=p->next;
  35. return tmp;
  36. }
  37. Iterator operator-- () { // prefix
  38. p=p->prev;
  39. return *this;
  40. }
  41. Iterator operator-- (int) { // postfix
  42. Iterator tmp = *this;
  43. p=p->prev;
  44. return tmp;
  45. }
  46. T& operator* () { return p->item; }
  47. T* operator-> () { return &(p->item); }
  48. friend class DLList<T>; // Liste man. p
  49. } ;
  50. // Iteratoren
  51. Iterator begin () const {return head;}
  52. Iterator end () const {return Iterator();}
  53. Iterator rbegin () const {return tail;}
  54. Iterator rend () const {return Iterator();}
  55. // Konstruktion, Destruktion, Zuweisung
  56. DLList ();
  57. DLList (const DLList<T>& list);
  58. DLList<T>& operator= (const DLList<T>&);
  59. ~DLList();
  60. // Listenmanipulation
  61. Iterator insert (Iterator i, T t);// einf. vor i
  62. void erase (Iterator i);
  63. void append (const DLList<T>& l);
  64. void clear ();
  65. bool empty () const;
  66. int size () const;
  67. Iterator find (T t) const;
  68. private:
  69. Iterator head; // erstes Element der Liste
  70. Iterator tail; // letztes Element der Liste
  71. } ;
  72. // Insertion
  73. template<class T>
  74. typename DLList<T>::Iterator
  75. DLList<T>::insert (Iterator i, T t)
  76. {
  77. Element* e = new Element(t);
  78. if (empty())
  79. {
  80. assert(i.p==0);
  81. head.p = tail.p = e;
  82. }
  83. else
  84. {
  85. e->next = i.p;
  86. if (i.p!=0)
  87. { // insert before i
  88. e->prev = i.p->prev;
  89. i.p->prev = e;
  90. if (head==i)
  91. head.p=e;
  92. }
  93. else
  94. { // insert at end
  95. e->prev = tail.p;
  96. tail.p->next = e;
  97. tail.p = e;
  98. }
  99. }
  100. return Iterator(e);
  101. }
  102. template<class T>
  103. void DLList<T>::erase (Iterator i)
  104. {
  105. if (i.p==0) return;
  106. if (i.p->next!=0)
  107. i.p->next->prev = i.p->prev;
  108. if (i.p->prev!=0)
  109. i.p->prev->next = i.p->next;
  110. if (head==i) head.p=i.p->next;
  111. if (tail==i) tail.p=i.p->prev;
  112. delete i.p;
  113. }
  114. template<class T>
  115. void DLList<T>::append (const DLList<T>& l) {
  116. for (Iterator i=l.begin(); i!=l.end(); i++)
  117. insert(end(),*i);
  118. }
  119. template<class T>
  120. bool DLList<T>::empty () const {
  121. return begin()==end();
  122. }
  123. template<class T>
  124. void DLList<T>::clear () {
  125. while (!empty())
  126. erase(begin());
  127. }
  128. // Constructors
  129. template<class T> DLList<T>::DLList () {}
  130. template<class T>
  131. DLList<T>::DLList (const DLList<T>& list) {
  132. append(list);
  133. }
  134. // Assignment
  135. template<class T>
  136. DLList<T>&
  137. DLList<T>::operator= (const DLList<T>& l) {
  138. if (this!=&l) {
  139. clear();
  140. append(l);
  141. }
  142. return *this;
  143. }
  144. // Destructor
  145. template<class T> DLList<T>::~DLList() { clear(); }
  146. // Size method
  147. template<class T> int DLList<T>::size () const {
  148. int count = 0;
  149. for (Iterator i=begin(); i!=end(); i++)
  150. count++;
  151. return count;
  152. }
  153. template<class T>
  154. typename DLList<T>::Iterator DLList<T>::find (T t) const {
  155. DLList<T>::Iterator i = begin();
  156. while (i!=end())
  157. {
  158. if (*i==t) break;
  159. i++;
  160. }
  161. return i;
  162. }
  163. template <class T>
  164. std::ostream& operator<< (std::ostream& s, DLList<T>& a) {
  165. s << "(";
  166. for (typename DLList<T>::Iterator i=a.begin();
  167. i!=a.end(); i++)
  168. {
  169. if (i!=a.begin()) s << " ";
  170. s << *i;
  171. }
  172. s << ")" << std::endl;
  173. return s;
  174. }