Advertisement
Guest User

Untitled

a guest
Dec 15th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.34 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. while (length != i) {
  131. if (length > i)
  132. pop_back();
  133. else
  134. push_back(0);
  135. }
  136. }
  137.  
  138. int size() {
  139. return length;
  140. }
  141.  
  142. void remove(T value) {
  143. int templength = length;
  144. element *temptop = new element (0, top);
  145. element *dop = temptop;
  146. while (templength != 0) {
  147. if (temptop->prev->data == value) {
  148. element *bum = temptop ->prev;
  149. temptop->prev = temptop->prev->prev;
  150. delete bum;
  151. length--;
  152. } else
  153. temptop = temptop->prev;
  154. templength--;
  155. }
  156. delete dop;
  157. }
  158.  
  159. T &operator[](int i) {
  160. element *cursor = top;
  161.  
  162. for (int j = length - 1; i < j; j--) {
  163. cursor = cursor->prev;
  164. }
  165.  
  166. return cursor->data;
  167. }
  168.  
  169. void swap(element *f, element *s) {
  170. int l = 0;
  171. if (s == top)
  172. {
  173. l = 1;
  174. }
  175. if (s->prev == f) {
  176. if (s->prev != top){
  177. s->prev = f->prev;
  178. f->prev = s->prev->prev;
  179. s->prev->prev = f;
  180. if (l == 1)
  181. top ->prev = s ->prev;
  182. } else
  183. {
  184. s = top-> prev;
  185. top ->prev = s ->prev;
  186. s ->prev = top;
  187. top = s;
  188. }
  189. }
  190. else {
  191. element *fdop = f->prev;
  192. element *sdop = s->prev;
  193. element *prfdop = fdop->prev;
  194. s->prev = fdop;
  195. fdop->prev = sdop->prev;
  196. f->prev = sdop;
  197. sdop->prev = prfdop;
  198. }
  199. }
  200.  
  201. void sort() {
  202. for (int i = 0; i < length; i++)
  203. {
  204. element *temptop = search(i);
  205. for (int j = i - 1; j >= 0; j--)
  206. {
  207. if (temptop ->prev -> prev ->data > temptop ->prev ->data)
  208. {
  209. swap(temptop -> prev, temptop);
  210. }
  211. if ((j == length -2) && (i == length - 1))
  212. temptop -> prev = top;
  213. temptop = temptop ->prev;
  214. }
  215. }
  216. }
  217. element *search(int i){
  218. element *temptop = new element(0, top);
  219. for (int templength = length; templength > i + 1; templength--)
  220. {
  221. temptop = temptop ->prev;
  222. }
  223. return temptop ;
  224. }
  225. struct Iterator {
  226. private:
  227. element *previt;
  228. public:
  229. Iterator(element *l) : previt(l) {};
  230.  
  231. T operator*() {
  232. return previt->data;
  233. }
  234.  
  235. Iterator &operator--() {
  236. return *(new Iterator(previt = previt-> prev ));
  237. }
  238.  
  239. bool operator==(const Iterator &temp) {
  240. return previt == temp.previt;
  241. }
  242.  
  243. bool operator!=(const Iterator &temp) {
  244. return previt != temp.previt;
  245. }
  246. };
  247.  
  248. Iterator &end() {
  249. return *(new Iterator(top));
  250. }
  251.  
  252. Iterator &begin() {
  253. return *(new Iterator(nullptr));
  254. }
  255.  
  256. ~list() {
  257. clear();
  258. }
  259. };
  260.  
  261.  
  262. int main() {
  263. list<int> a;
  264. a.remove(4);
  265. a.push_back(4);
  266. a.push_back(100);
  267. a.resize(1);
  268. cout << endl;
  269. a.sort();
  270. list<int>::Iterator z = a.end();
  271. while (z!= a.begin()) {
  272. cout << *z << " ";
  273. --z;
  274. }
  275. return 0;
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement