fork download
  1. #include <iostream>
  2.  
  3. struct list {
  4. int inf;
  5. list* next;
  6. list* prev;
  7. };
  8.  
  9. bool list_add(list*& head, list*& tail, int inf);
  10. void list_clear(list*& head, list*& tail);
  11.  
  12. //удаление дубликатов
  13. void list_unique(list*& head, list*& tail){
  14. list* p1, *p2, *t;
  15. for(p1 = head; p1 != NULL; ){
  16. for(p2 = p1->next; p2 != NULL; ){
  17. if(p2->inf == p1->inf){
  18. t = p2;
  19. if(p2 == tail){
  20. tail = tail->prev;
  21. p2 = tail->next = NULL;
  22. } else {
  23. p2->next->prev = p2->prev;
  24. p2->prev->next = p2->next;
  25. p2 = t->next;
  26. }
  27. delete t;
  28. continue;
  29. }
  30. p2 = p2->next;
  31. }
  32. p1 = p1->next;
  33. }
  34. }
  35.  
  36.  
  37. int main(void){
  38. list* head = NULL, *tail = NULL;
  39.  
  40. for(int i = 0; i < 10; ++i){
  41. for(int j = 0; j < 10; ++j)
  42. list_add(head, tail, j);
  43. }
  44.  
  45. list_unique(head, tail);
  46.  
  47. const list* p;
  48. for(p = head; p != NULL; p = p->next)
  49. std::cout << p->inf << ' ';
  50. std::cout << std::endl;
  51.  
  52. for(p = tail; p != NULL; p = p->prev)
  53. std::cout << p->inf << ' ';
  54. std::cout << std::endl;
  55.  
  56. list_clear(head, tail);
  57. return 0;
  58. }
  59.  
  60.  
  61. //добавление элемента в конец списка
  62. bool list_add(list*& head, list*& tail, int inf){
  63. list* p = new (std::nothrow) list();
  64. if(p != NULL){
  65. p->inf = inf;
  66. p->next = p->prev = NULL;
  67.  
  68. if(head == NULL)
  69. head = tail = p;
  70. else {
  71. tail->next = p;
  72. p->prev = tail;
  73. tail = p;
  74. }
  75. }
  76. return (p != NULL);
  77. }
  78.  
  79. //удаление всех
  80. void list_clear(list*& head, list*& tail){
  81. list* t;
  82. while(head != NULL){
  83. t = head;
  84. head = head->next;
  85. delete t;
  86. }
  87. tail = NULL;
  88. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
0 1 2 3 4 5 6 7 8 9 
9 8 7 6 5 4 3 2 1 0