Advertisement
Guest User

Untitled

a guest
Dec 15th, 2017
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <exception>
  3. using namespace std;
  4.  
  5. class ListException : public exception {
  6. const char* why;
  7. public:
  8. ListException(const char* reason) : why(reason) {}
  9. virtual const char* what() const throw() {
  10. return why;
  11. };
  12. };
  13.  
  14. template<typename T>
  15. class list {
  16. struct element {
  17. T data;
  18. element *prev;
  19.  
  20. element(T x, element *elem) : data(x), prev(elem) {};
  21. };
  22.  
  23. int length;
  24. element *top;
  25. public:
  26.  
  27. list():length(0), top(nullptr){}
  28. void print() {
  29. cout << endl;
  30. element* temp = top;
  31. while (temp != nullptr) {
  32. cout << temp->data << '\t';
  33. temp = temp->prev;
  34. }
  35. }
  36.  
  37. bool empty() {
  38. return length;
  39. }
  40.  
  41. void push_front(T x) {
  42. insert(x, 0);
  43. }
  44.  
  45. void pop_front() {
  46. if(length > 0)
  47. {
  48. int templength = length;
  49. element *temptop = top;
  50. if (length > 0) {
  51. while (templength != 2) {
  52. temptop = temptop->prev;
  53. templength--;
  54. }
  55. }
  56. delete temptop -> prev;
  57. temptop->prev = nullptr;
  58. length--;
  59. }
  60. }
  61. void insert(int i, T x) {
  62. if (i + 1 == length)
  63. push_back(x);
  64. if ((length >= i + 1) && i >= 0) {
  65. int templength = length;
  66. element *temp = new element(top->data, top);
  67. top = temp;
  68. temp = top;
  69. temp = temp->prev;
  70. while (templength != i + 1) {
  71. temp->data = temp->prev->data;
  72. temp = temp->prev;
  73. templength--;
  74. }
  75. temp->data = x;
  76. length++;
  77. }
  78. }
  79.  
  80. T back() {
  81. return top->data;
  82. }
  83.  
  84. T front() {
  85. if (length > 0)
  86. {
  87. int templength = length;
  88. element *temptop = top;
  89. if (length > 0) {
  90. while (templength != 1) {
  91. temptop = temptop->prev;
  92. templength--;
  93. }
  94. }
  95. T res = temptop->data;
  96. return res;
  97. }
  98. else throw ListException("zero length");
  99. }
  100.  
  101. void pop_back() {
  102. element *temptop = top;
  103. top = top -> prev;
  104. delete temptop;
  105. length--;
  106. }
  107.  
  108. void push_back(T x) {
  109. element *temp = new element(x, top);
  110. top = temp;
  111. length++;
  112. }
  113.  
  114. void clear() {
  115. while(length != 0)
  116. {
  117. pop_back();
  118. }
  119. }
  120.  
  121. void resize(int i, T value) {
  122. if (i > length) {
  123. while (i != length) {
  124. push_back(value);
  125. }
  126. }
  127. }
  128.  
  129. void resize(int i) {
  130. if (i < length)
  131. {
  132. while (length != i) {
  133. pop_back();
  134. }
  135. } else
  136. {
  137. while (length != i)
  138. push_back(0);
  139. }
  140. }
  141.  
  142. int size() {
  143. return length;
  144. }
  145.  
  146. void remove(T value) {
  147. int templength = length;
  148. element *temptop = new element (0, top);
  149. element *dop = temptop;
  150. while (templength != 0) {
  151. if (temptop->prev->data == value) {
  152. element *bum = temptop ->prev;
  153. temptop->prev = temptop->prev->prev;
  154. delete bum;
  155. length--;
  156. } else
  157. temptop = temptop->prev;
  158. templength--;
  159. }
  160. delete dop;
  161. }
  162.  
  163. T &operator[](int i) {
  164. element *cursor = top;
  165.  
  166. for (int j = length - 1; i < j; j--) {
  167. cursor = cursor->prev;
  168. }
  169.  
  170. return cursor->data;
  171. }
  172.  
  173. void swap(element *f, element *s) {
  174. int l = 0;
  175. if (s == top)
  176. {
  177. l = 1;
  178. }
  179. if (s->prev == f) {
  180. if (s->prev != top){
  181. s->prev = f->prev;
  182. f->prev = s->prev->prev;
  183. s->prev->prev = f;
  184. if (l == 1)
  185. top ->prev = s ->prev;
  186. } else
  187. {
  188. s = top-> prev;
  189. top ->prev = s ->prev;
  190. s ->prev = top;
  191. top = s;
  192. }
  193. }
  194. else {
  195. element *fdop = f->prev;
  196. element *sdop = s->prev;
  197. element *prfdop = fdop->prev;
  198. s->prev = fdop;
  199. fdop->prev = sdop->prev;
  200. f->prev = sdop;
  201. sdop->prev = prfdop;
  202. }
  203. }
  204.  
  205. void sort() {
  206. for (int i = 0; i < length; i++)
  207. {
  208. element *temptop = search(i);
  209. for (int j = i - 1; j >= 0; j--)
  210. {
  211. if (temptop ->prev -> prev ->data > temptop ->prev ->data)
  212. {
  213. swap(temptop -> prev, temptop);
  214. }
  215. if ((j == length -2) && (i == length - 1))
  216. temptop -> prev = top;
  217. temptop = temptop ->prev;
  218. }
  219. }
  220. }
  221. element *search(int i){
  222. element *temptop = new element(0, top);
  223. for (int templength = length; templength > i + 1; templength--)
  224. {
  225. temptop = temptop ->prev;
  226. }
  227. return temptop ;
  228. }
  229. struct Iterator {
  230. private:
  231. element *previt;
  232. public:
  233. Iterator(element *l) : previt(l) {};
  234.  
  235. T operator*() {
  236. return previt->data;
  237. }
  238.  
  239. Iterator &operator--() {
  240. return *(new Iterator(previt = previt-> prev ));
  241. }
  242.  
  243. bool operator==(const Iterator &temp) {
  244. return previt == temp.previt;
  245. }
  246.  
  247. bool operator!=(const Iterator &temp) {
  248. return previt != temp.previt;
  249. }
  250. };
  251.  
  252. Iterator &end() {
  253. return *(new Iterator(top));
  254. }
  255.  
  256. Iterator &begin() {
  257. return *(new Iterator(nullptr));
  258. }
  259.  
  260. ~list() {
  261. clear();
  262. }
  263. };
  264.  
  265.  
  266. int main() {
  267. list<int> a;
  268. a.remove(4);
  269. a.push_back(4);
  270. a.push_back(100);
  271. a.resize (5);
  272. a.pop_front();
  273. cout << endl;
  274. a.sort();
  275. list<int>::Iterator z = a.end();
  276. while (z!= a.begin()) {
  277. cout << *z << " ";
  278. --z;
  279. }
  280. return 0;
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement