fork(1) download
  1. //ali eldin mahmoud mohamed
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5. typedef int Data;
  6. struct node{
  7. node *prev;
  8. Data ele;
  9. node *next;
  10. };
  11.  
  12. class DLL{
  13. private:
  14. int counter;
  15. node *head;
  16. node *tail;
  17. public:
  18. DLL(){
  19. counter=0;
  20. head=NULL;
  21. tail=NULL;
  22. }
  23. void insert(Data x, node *p){
  24. node *temp = new node;
  25. temp->ele = x;
  26. temp->prev = NULL;
  27. temp->next = NULL;
  28.  
  29. if(head == NULL){
  30. head = temp;
  31. tail = temp;
  32. counter++;
  33. return;
  34. }
  35.  
  36. if(p == NULL){
  37. temp->prev = tail;
  38. tail->next = temp;
  39. tail = temp;
  40. } else {
  41. temp->prev = p->prev;
  42. temp->next = p;
  43.  
  44. if(p->prev != NULL){
  45. p->prev->next = temp;
  46. } else {
  47. head = temp;
  48. }
  49. p->prev = temp;
  50. }
  51. counter++;
  52. }
  53. void print(){
  54. node *p=head;
  55. while(p!=NULL){
  56. cout<<p->ele<<"\t";
  57. p=p->next;
  58. }
  59. cout << endl;
  60. }
  61. node * end(){
  62. return tail;
  63. }
  64. node * first(){
  65. return head;
  66. }
  67. int size(){
  68. return counter;
  69. }
  70. node *next(node *p){
  71. if(p==NULL)return NULL;
  72. return p->next;
  73. }
  74. node *previous(node *p){
  75. if(p==NULL)return NULL;
  76. return p->prev;
  77. }
  78. node * locate(Data x){
  79. node *p=head;
  80. while(p!=NULL){
  81. if(p->ele==x)
  82. return p;
  83. p=p->next;
  84. }
  85. cout<<"not found\n";
  86. return end();
  87. }
  88. Data retrieve(node *p){
  89. if(p==NULL){
  90. cout<<"out of range\n";
  91. return -1;
  92. }
  93. return p->ele;
  94. }
  95. void makeNull() {
  96. while (head != NULL) {
  97. node* temp = head;
  98. head = head->next;
  99. delete temp;
  100. }
  101. tail = NULL;
  102. counter = 0;
  103. }
  104. void Delete(node *p){
  105. if(p==NULL){
  106. cout<<"out of range \n";
  107. return;
  108. }
  109. node *temp=p;
  110. if(p!=tail){
  111. p->next->prev=p->prev;
  112. }else{
  113. tail=p->prev;
  114. }
  115. if(p!=head){
  116. p->prev->next=p->next;
  117.  
  118. }else{
  119. head=p->next;
  120. }
  121.  
  122. delete temp;
  123. counter--;
  124. }
  125. void insertFromBack(Data x){
  126. insert(x,NULL);
  127. }
  128. };
  129. void purge(DLL &l){
  130. node *i=l.first();
  131. node *j,*temp;
  132.  
  133. while(i!=NULL){
  134. j=l.next(i);
  135. while(j!=NULL){
  136. if(l.retrieve(j)==l.retrieve(i)){
  137. temp=j;
  138. j=l.next(j);
  139. l.Delete(temp);
  140. }else{
  141. j=l.next(j);
  142. }
  143. }
  144. i=l.next(i);
  145. }
  146. }
  147. void reverse(DLL &l){
  148. DLL n;
  149. node *i=l.first();
  150. while(i!=NULL){
  151. n.insert(l.retrieve(i), n.first());
  152. i=l.next(i);
  153. }
  154. l=n;
  155. }
  156. int main(){
  157. DLL l,n;
  158.  
  159. l.insert(1, l.first());
  160. l.insert(2, l.first());
  161. l.insert(3, l.first());
  162. l.insert(4, l.first());
  163. l.insert(5, l.first());
  164. cout << "Before reverse: ";
  165. l.print();
  166. reverse(l);
  167. cout << "After reverse: ";
  168. l.print();
  169.  
  170. n.insertFromBack(2);
  171. n.insertFromBack(2);
  172. n.insertFromBack(2);
  173. n.insertFromBack(3);
  174. n.insertFromBack(5);
  175.  
  176. cout << "Before purge: ";
  177. n.print();
  178. purge(n);
  179. cout << "After purge: ";
  180. n.print();
  181.  
  182. n.Delete(n.locate(5));
  183. n.print();
  184. return 0;
  185. }
  186.  
Success #stdin #stdout 0.01s 5260KB
stdin
Standard input is empty
stdout
Before reverse: 5	4	3	2	1	
After reverse: 1	2	3	4	5	
Before purge: 2	2	2	3	5	
After purge: 2	3	5	
2	3