Advertisement
zodiak1

Untitled

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