fork download
  1. // СвСп.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. //#include "stdafx.h"
  5. #include <iostream>
  6. //#include <assert.h>
  7. #include <cassert>
  8.  
  9. using namespace std;
  10.  
  11. // -->
  12. template<typename>
  13. class ListSpisok;
  14. // <--
  15.  
  16. template <class NODETYPE>
  17. class Spisok {
  18. friend class ListSpisok<NODETYPE>;
  19. public:
  20. Spisok(const NODETYPE &);
  21. NODETYPE getData() const { return data; }
  22. private:
  23. Spisok<NODETYPE> *nextPtr;
  24. NODETYPE data;
  25. };
  26.  
  27. template <class NODETYPE>
  28. Spisok<NODETYPE>::Spisok(const NODETYPE &ch) {
  29. data = ch;
  30. nextPtr = 0;
  31. }
  32.  
  33. template <class NODETYPE>
  34. class ListSpisok {
  35. public:
  36. ListSpisok();
  37. ~ListSpisok();
  38. void addInTheEnd(const NODETYPE &);
  39. void addInTheBeginning(const NODETYPE &);
  40. void removeInTheEnd(NODETYPE &);
  41. void removeInTheBeginning(NODETYPE &);
  42. int isEmpty() const;
  43. void print() const;
  44. private:
  45. Spisok<NODETYPE> *firstPtr;
  46. Spisok<NODETYPE> *lastPtr;
  47. };
  48.  
  49. template <class NODETYPE>
  50. ListSpisok<NODETYPE>::ListSpisok() { firstPtr = lastPtr = 0; }
  51.  
  52. template <class NODETYPE>
  53. ListSpisok<NODETYPE>::~ListSpisok()
  54. {
  55. if (! isEmpty()) {
  56. Spisok<NODETYPE> *currentPtr = firstPtr, *temp;
  57. while (currentPtr != 0) {
  58. temp = currentPtr;
  59. currentPtr = currentPtr->nextPtr;
  60. delete temp;
  61. }
  62. }
  63. }
  64.  
  65. template <class NODETYPE>
  66. void ListSpisok<NODETYPE>::addInTheEnd(const NODETYPE &ch)
  67. {
  68. Spisok<NODETYPE> *newPtr = new Spisok<NODETYPE>(ch);
  69. assert(newPtr != 0);
  70.  
  71. if (isEmpty())
  72. firstPtr = lastPtr = newPtr;
  73. else {
  74. lastPtr->nextPtr = newPtr;
  75. lastPtr = newPtr;
  76. }
  77. }
  78.  
  79. template <class NODETYPE>
  80. void ListSpisok<NODETYPE>::addInTheBeginning(const NODETYPE &ch)
  81. {
  82. Spisok<NODETYPE> *newPtr = new Spisok<NODETYPE>(ch);
  83. assert(newPtr != 0);
  84.  
  85. if (isEmpty())
  86. firstPtr = lastPtr = newPtr;
  87. else {
  88. newPtr->nextPtr = firstPtr;
  89. firstPtr = newPtr;
  90. }
  91. }
  92.  
  93. template <class NODETYPE>
  94. void ListSpisok<NODETYPE>::removeInTheEnd(NODETYPE &ch)
  95. {
  96. if (isEmpty())
  97. return;
  98. else {
  99. ch = lastPtr->data;
  100. if (firstPtr == lastPtr)
  101. firstPtr = lastPtr = 0;
  102. else {
  103. Spisok<NODETYPE> *currentPtr = firstPtr, *tempPtr = lastPtr;
  104. while (currentPtr->nextPtr != lastPtr)
  105. currentPtr = currentPtr->nextPtr;
  106. lastPtr = currentPtr;
  107. lastPtr->nextPtr = 0;
  108. delete tempPtr;
  109. }
  110. }
  111. }
  112.  
  113. template <class NODETYPE>
  114. void ListSpisok<NODETYPE>::removeInTheBeginning(NODETYPE &ch)
  115. {
  116. if (isEmpty())
  117. return;
  118. else {
  119. Spisok<NODETYPE> *tempPtr = firstPtr;
  120.  
  121. if (firstPtr == lastPtr)
  122. firstPtr = lastPtr = 0;
  123. else
  124. firstPtr = firstPtr->nextPtr;
  125. ch = tempPtr->data;
  126. delete tempPtr;
  127. }
  128. }
  129.  
  130. template <class NODETYPE>
  131. int ListSpisok<NODETYPE>::isEmpty() const { return firstPtr == 0; }
  132.  
  133. template <class NODETYPE>
  134. void ListSpisok<NODETYPE>::print() const
  135. {
  136. if (! isEmpty()) {
  137. Spisok<NODETYPE> *current = firstPtr;
  138. while (current != 0) {
  139. cout << current->data << ' ';
  140. current = current->nextPtr;
  141. }
  142. }
  143. }
  144.  
  145. template <class NODETYPE>
  146. void concatenate(ListSpisok<NODETYPE> &, ListSpisok<NODETYPE> &);
  147.  
  148. // int _tmain(int argc, _TCHAR* argv[])
  149. int main()
  150. {
  151. // setlocale(LC_ALL, "Russian");
  152. /* ListSpisok<char> first, second;
  153.   char ch;
  154.   first.addInTheEnd('a');
  155.   first.addInTheEnd('b');
  156.   second.addInTheEnd('c');
  157.   second.addInTheEnd('d');
  158.   concatenate(first, second);
  159.   first.print();*/
  160.  
  161. //system("pause");
  162. return 0;
  163. }
  164.  
  165. template <class NODETYPE>
  166. void concatenate(ListSpisok<NODETYPE> &first, ListSpisok<NODETYPE> &second) {
  167. NODETYPE temp;
  168. while (! second.isEmpty()) {
  169. second.removeInTheBeginning(temp);
  170. first.addInTheEnd(temp);
  171. }
  172. }
  173.  
  174.  
  175.  
Success #stdin #stdout 0s 2848KB
stdin
Standard input is empty
stdout
Standard output is empty