fork download
  1. #include <iostream>
  2. #include <string>
  3.  
  4. template <class NODETYPE>
  5. class ListNode {
  6. public:
  7. ListNode(const NODETYPE &);
  8. NODETYPE getData()const;
  9. void SetNextPtr(ListNode<NODETYPE> * newPtr);
  10. ListNode <NODETYPE>* GetNextPtr() const;
  11. private:
  12. NODETYPE data;
  13. ListNode <NODETYPE> *nextPtr;
  14. };
  15.  
  16. template<class NODETYPE>
  17. ListNode <NODETYPE>::ListNode(const NODETYPE & info) : data(info), nextPtr(0) {}
  18.  
  19. template <class NODETYPE>
  20. NODETYPE ListNode <NODETYPE>::getData()const { return data; }
  21.  
  22. template <class NODETYPE>
  23. ListNode<NODETYPE> * ListNode <NODETYPE>::GetNextPtr()const { return nextPtr; }
  24.  
  25. template <class NODETYPE>
  26. void ListNode <NODETYPE>::SetNextPtr(ListNode<NODETYPE> * newPtr) { nextPtr = newPtr; }
  27.  
  28. using std::cout;
  29.  
  30. template<class NODETYPE>
  31.  
  32. class List {
  33. public:
  34. List();
  35. ~List();
  36. void insertAtFront(const NODETYPE &);
  37. void insertAtBack(const NODETYPE &);
  38. // bool removeFromFront(NODETYPE &);
  39. // bool removeFromBack(NODETYPE &);
  40. ListNode <NODETYPE>* GetLastPtr() const;
  41. ListNode <NODETYPE>* GetFirstPtr() const;
  42. bool isEmpty()const;
  43. void print()const;
  44. private:
  45. ListNode <NODETYPE>* firstPtr;
  46. //ListNode <NODETYPE>* lastPtr;
  47. ListNode <NODETYPE>* getNewNode(const NODETYPE &);
  48. };
  49.  
  50.  
  51. //конструктор
  52. template <class NODETYPE>
  53. List<NODETYPE>::List() :firstPtr(0) {}
  54. //деструктор
  55. template<class NODETYPE>
  56. List<NODETYPE>::~List() {
  57. if (!isEmpty()) {
  58. cout << "clear list....\n";
  59. }
  60. ListNode<NODETYPE> *currentPtr = firstPtr, *tempPtr;
  61.  
  62. while (currentPtr != 0)
  63. {
  64. tempPtr = currentPtr->GetNextPtr();
  65. delete currentPtr;
  66. currentPtr = tempPtr;
  67. }
  68. firstPtr = 0;
  69. cout << "All nodes removed \n\n";
  70. }
  71.  
  72.  
  73. template <class NODETYPE>
  74. ListNode <NODETYPE>* List<NODETYPE>::GetLastPtr() const
  75. {
  76. ListNode <NODETYPE>* current = firstPtr;
  77. while (current->GetNextPtr() != NULL)
  78. {
  79. current = current->GetNextPtr();
  80. }
  81. return current;
  82. }
  83.  
  84. template <class NODETYPE>
  85. ListNode <NODETYPE>* List<NODETYPE>::GetFirstPtr() const
  86. {
  87. return firstPtr;
  88. }
  89.  
  90. //вставить узел в начало списка
  91. template <class NODETYPE>
  92. void List<NODETYPE>::insertAtFront(const NODETYPE &value) {
  93. ListNode<NODETYPE>* newPtr = getNewNode(value);
  94. if (isEmpty()) {
  95. firstPtr = newPtr;
  96. }
  97. else {
  98. newPtr->nextPtr = firstPtr;
  99. firstPtr = newPtr;
  100. }
  101. }
  102. //вставить узел в конец списка
  103. template <class NODETYPE>
  104. void List<NODETYPE>::insertAtBack(const NODETYPE & value) {
  105. ListNode<NODETYPE> *newPtr = getNewNode(value);
  106. if (isEmpty()) {
  107. firstPtr = newPtr;
  108. }
  109. else
  110. {
  111. ListNode <NODETYPE>* lastPtr = GetLastPtr();
  112. lastPtr->SetNextPtr(newPtr);
  113. }
  114. }
  115.  
  116.  
  117. //создание нового обекта ListNode
  118. template <class NODETYPE>
  119. ListNode<NODETYPE>*List<NODETYPE>::getNewNode(const NODETYPE & value) {
  120. ListNode<NODETYPE> *ptr = new ListNode<NODETYPE>(value);
  121. // assert(ptr != 0);
  122. return ptr;
  123. }
  124. //проверка пуст ли список
  125. template <class NODETYPE>
  126. bool List<NODETYPE>::isEmpty()const {
  127. return firstPtr == 0;
  128. }
  129. //печать списка
  130. template<class NODETYPE>
  131. void List<NODETYPE>::print()const {
  132. if (isEmpty()) { cout << "Empty \n"; return; }
  133.  
  134.  
  135. ListNode<NODETYPE>* tempPtr = firstPtr;
  136. while (tempPtr != 0) {
  137. std::cout << tempPtr->getData() << " ";
  138. tempPtr = tempPtr->GetNextPtr();
  139. }
  140. cout << "\n\n";
  141. }
  142.  
  143. // функция контенации
  144. template<class NODETYPE>
  145. void contenace(List<NODETYPE>& List1, List<NODETYPE>& List2) {
  146. ListNode<NODETYPE>* lastPtr = List1.GetLastPtr();
  147. lastPtr->SetNextPtr(List2.GetFirstPtr()); //получить доступ к указателю nextPtr последнего элемента списка List1 и присвоить ему указтле firstPtr списка List2;
  148.  
  149. }
  150.  
  151. int main() {
  152. List<char> L1;
  153. List<char>L2;
  154.  
  155.  
  156. std::string st = "abcde";
  157. for (int i = 0; i<5; i++) {
  158. L1.insertAtBack(st[i]);
  159. }
  160. L1.print();
  161. cout << "\n";
  162.  
  163. st = "fgjkl";
  164. for (int i = 0; i < 5; i++) {
  165. L2.insertAtBack(st[i]);
  166. }
  167. cout << "\n";
  168. L2.print();
  169. cout << " L1+L2 \n";
  170. contenace<char>(L1, L2);
  171. L1.print();
  172. return 0;
  173. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
a b c d e 



f g j k l 

 L1+L2 
a b c d e f g j k l 

clear list....
All nodes removed 

clear list....
All nodes removed