fork download
  1. // Ahmed mohamed mostafa azazy
  2. // Computer Science
  3. #include<iostream>
  4. #include<string>
  5. using namespace std;
  6.  
  7. class DoublyLinkedList
  8. {
  9. private:
  10. struct Node
  11. {
  12. int data;
  13. Node* next;
  14. Node* prev;
  15.  
  16. Node() {
  17. next = NULL; // inatial state
  18. prev = NULL;
  19. }
  20. };
  21.  
  22. Node* head = NULL;
  23.  
  24. public:
  25.  
  26. void append(int val) // if user don't insert position
  27. {
  28. Node* newNode = new Node;
  29. newNode->data = val;
  30. if (head == NULL)
  31. {
  32. head = newNode;
  33. }
  34. else
  35. {
  36. Node* temp = head;
  37. while (temp->next != NULL)
  38. {
  39. temp = temp->next;
  40. }
  41. temp->next = newNode;
  42. newNode->prev = temp;
  43. }
  44. };
  45.  
  46.  
  47. void insert_at_pos(int val, int pos)
  48. {
  49. Node* newNode = new Node;
  50. newNode->data = val;
  51.  
  52. if (head == NULL)
  53. {
  54. head = newNode;
  55. return;
  56. }
  57.  
  58. if (pos == 0)
  59. {
  60. newNode->next = head;
  61. head->prev = newNode;
  62. head = newNode;
  63. return;
  64. }
  65.  
  66. Node* temp = head;
  67. for (int i = 0; i < pos && temp != NULL; i++)
  68. {
  69. temp = temp->next;
  70. }
  71.  
  72.  
  73. // if temp get null after loop will insert at last of list
  74. if (temp == NULL) {
  75. this->append(val);
  76. return;
  77. }
  78.  
  79. newNode->prev = temp->prev;
  80. temp->prev->next = newNode;
  81. temp->prev = newNode;
  82. newNode->next = temp;
  83.  
  84. };;
  85.  
  86. int locate(int value)
  87. {
  88. Node* temp = head;
  89. int pos = 0;
  90.  
  91. while (temp != NULL)
  92. {
  93. if (temp->data == value)
  94. return pos;
  95.  
  96. temp = temp->next;
  97. pos++;
  98. }
  99.  
  100. cout << "Value not found\n";
  101. return -1;
  102. }
  103.  
  104.  
  105.  
  106. void delete_at_pos(int pos)
  107. {
  108. if (head == NULL || pos < 0)
  109. {
  110. cout << "Invalid position or empty list\n";
  111. return;
  112. }
  113.  
  114. Node* temp = head;
  115.  
  116.  
  117. if (pos == 0)
  118. {
  119. head = head->next;
  120. if (head != NULL)
  121. head->prev = NULL;
  122.  
  123. delete temp;
  124. return;
  125. }
  126.  
  127.  
  128. for (int i = 0; i < pos && temp != NULL; i++)
  129. {
  130. temp = temp->next;
  131. }
  132.  
  133. if (temp == NULL)
  134. {
  135. cout << "Position out of bounds\n";
  136. return;
  137. }
  138.  
  139.  
  140. if (temp->prev != NULL)
  141. temp->prev->next = temp->next;
  142.  
  143. if (temp->next != NULL)
  144. temp->next->prev = temp->prev;
  145.  
  146. delete temp;
  147. }
  148.  
  149.  
  150. int retrieve(int pos)
  151. {
  152. if (pos < 0)
  153. {
  154. cout << "Invalid position\n";
  155. return -1;
  156. }
  157.  
  158. Node* temp = head;
  159. int current = 0;
  160.  
  161. while (temp != NULL)
  162. {
  163. if (current == pos)
  164. return temp->data;
  165.  
  166. temp = temp->next;
  167. current++;
  168. }
  169.  
  170. cout << "Position out of bounds\n";
  171. return -1;
  172. }
  173.  
  174. int get_size()
  175. {
  176. int count = 0;
  177. Node* temp = head;
  178.  
  179. while (temp != NULL)
  180. {
  181. count++;
  182. temp = temp->next;
  183. }
  184.  
  185. return count;
  186. };
  187.  
  188. void reverse() {
  189. Node* current = head;
  190. Node* temp = NULL;
  191.  
  192. while (current != NULL) {
  193. temp = current->prev;
  194. current->prev = current->next;
  195. current->next = temp;
  196.  
  197. current = current->prev;
  198. }
  199.  
  200. if (temp != NULL)
  201. head = temp->prev;
  202. }
  203.  
  204.  
  205. void purge()
  206. {
  207. Node* temp = head;
  208. while (temp != NULL)
  209. {
  210. Node* nextNode = temp->next;
  211. delete temp;
  212. temp = nextNode;
  213. }
  214. head = NULL;
  215. }
  216.  
  217. void display()
  218. {
  219. Node* temp = head;
  220.  
  221. while (temp != NULL)
  222. {
  223. cout << temp->data << "\t";
  224. temp = temp->next;
  225. }
  226.  
  227. cout << endl;
  228. }
  229.  
  230. };
  231.  
  232. int main()
  233. {
  234. DoublyLinkedList l1;
  235.  
  236. l1.append(10);
  237. l1.append(20);
  238. l1.append(30);
  239. l1.append(40);
  240. l1.display();
  241.  
  242. l1.insert_at_pos(15, 1);
  243. l1.insert_at_pos(5, 0);
  244. l1.insert_at_pos(50, 10);
  245. l1.display();
  246.  
  247. cout << l1.locate(30) << endl;
  248.  
  249. l1.delete_at_pos(0);
  250. l1.delete_at_pos(2);
  251. l1.display();
  252.  
  253. cout << l1.retrieve(2) << endl;
  254.  
  255. cout << l1.get_size() << endl;
  256.  
  257. l1.reverse();
  258. l1.display();
  259.  
  260. l1.purge();
  261. l1.display();
  262.  
  263. return 0;
  264. }
Success #stdin #stdout 0s 5272KB
stdin
Standard input is empty
stdout
10	20	30	40	
5	10	15	20	30	40	50	
4
10	15	30	40	50	
30
5
50	40	30	15	10