zodiak1

DSA_PracticalTask_P1

Mar 5th, 2022 (edited)
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <locale.h>
  4. #include <windows.h>
  5.  
  6. struct list
  7. {
  8. list(char _elem = 0, list *_next = NULL, list *_prev = NULL) : elem(_elem), next(_next), prev(_prev) { }
  9.  
  10. char elem;
  11. list *next, *prev;
  12. };
  13.  
  14. void print(list *l, ULONGLONG n);
  15. char input(const char *path, list *l, ULONGLONG *n);
  16. ULONGLONG delete_neighbourses(list **l, ULONGLONG n);
  17.  
  18. int main()
  19. {
  20. setlocale(0, "");
  21.  
  22. ULONGLONG n = 0;
  23. list *L = new list();
  24. char r = input("symbols.txt", L, &n);
  25.  
  26. if (r != -1)
  27. print(L, n - delete_neighbourses(&L, n));
  28.  
  29. return r != -1 ? 0 * _getch() : -1;
  30. }
  31.  
  32. char input(const char *path, list *l, ULONGLONG *n)
  33. {
  34. FILE *stream = NULL;
  35. fopen_s(&stream, path, "r");
  36.  
  37. if (stream)
  38. {
  39. char elem = 0;
  40. list *t = NULL;
  41.  
  42. bool read = true;
  43. for (list *p = l; read; )
  44. {
  45. if (read = fscanf_s(stream, "%c", &elem, 1) != EOF)
  46. {
  47. p->next = t;
  48. p = t ? p->next : p;
  49.  
  50. p->elem = elem;
  51. t = new list(0, NULL, p);
  52.  
  53. (*n)++;
  54. }
  55. else
  56. {
  57. p->next = l;
  58. l->prev = p;
  59. }
  60. }
  61.  
  62. return 0;
  63. }
  64. else
  65. {
  66. perror("Не удалось считать файл по причине");
  67. return -1;
  68. }
  69. }
  70.  
  71. ULONGLONG delete_neighbourses(list **l, ULONGLONG n)
  72. {
  73. ULONGLONG d = 0, i = 0;
  74. for (list **p = l; n - d > 2 && i != n; )
  75. {
  76. if ((*p)->prev->elem == (*p)->next->elem)
  77. {
  78. list *t = *p; // Элемент на удаление
  79. *p = (*p)->next; // Текущий элемент - следующий
  80.  
  81. if (*l == t) *l = *p;
  82.  
  83. t->prev->next = (*p); // У предыдущего новая ссылка на следующий
  84. (*p)->prev = t->prev; // У следующего ссылка на предыдущий - предыдущий удаленного
  85.  
  86. delete t;
  87. d++;
  88. }
  89. else
  90. {
  91. p = &(*p)->next;
  92. i++;
  93. }
  94. }
  95.  
  96. return d;
  97. }
  98.  
  99. void print(list *l, ULONGLONG n)
  100. {
  101. printf_s("Результат программы: \n");
  102. if (n)
  103. for (list *p = l; n; p = p->next, n--)
  104. printf_s("%c", p->elem);
  105. else
  106. printf_s("Пустой список");
  107. }
Add Comment
Please, Sign In to add comment