CCCPaste

f048ae7e9a8c7

#include 
#include 
#include 

struct list
{
   list(char _elem = 0, list *_next = NULL) : elem(_elem), next(_next) { }

   char elem;
   list *next;
};

void print(list *l);
char input(const char *path, list **l);

int main()
{
   setlocale(0, "");

   list *S = new list();

   char r = input("symbols.txt", &S);
   if (r != -1)
      print(S);

   return r != -1 ? 0 * _getch() : -1;
}

char input(const char *path, list **l)
{
   FILE *stream = NULL;
   fopen_s(&stream, path, "r");

   if (stream)
   {
      char elem = 0;
      // p - добавляет элементы в l, dl - список удаленных из l элементов, dl_l - последний удаленный элемент в dl.
      list *p = *l, *dl = new list(), *dl_l = dl;

      while (fscanf_s(stream, "%c", &elem, 1) != EOF)
      {
         // is_u - элемент уникален в списке, off_dl - элемент не находится в dl.
         bool is_u = true, off_dl = true;
         // t - дубликат elem в l, t_pr - предыдущий t.
         list *t = *l, *t_pr = NULL;

         // Поиск elem среди удаленных элементов.
         for (list *d = dl; d && off_dl; d = d->next)
            off_dl = d->elem != elem;
         // Поиск дубликата elem в l.
         for (bool f = is_u && off_dl; f; )
         {
            is_u = t->elem != elem;

            if (is_u && t->next)
            {
               t_pr = t;
               t = t->next;
            }
            else f = false;
         }

         // elem прочитан из файла впервые.
         if (is_u && off_dl)
         {
            p->elem = elem;
            p->next = new list();
            p = p->next;
         }
         else if (off_dl)
         {
            // Добавление elem в dl.
            dl_l->elem = elem;
            dl_l->next = new list();
            dl_l = dl_l->next;

            // t - первый элемент в l.
            if (t == *l)
               *l = t->next;
            else
               t_pr->next = t->next;
            
            delete t;
         }
      }
      // Удаление dl.
      for (list *d = dl; d; )
      {
         list *t = d;
         d = d->next;
         delete t;
      }

      fclose(stream);
      return 0;
   }
   else
   {
      perror("Завершение работы программы");
      return -1;
   }
}

void print(list *l)
{
   if (l)
      for (list *p = l; p; p = p->next)
         printf_s("%c", p->elem);
   else
      printf_s("Уникальные элементы не были обнаружены.");
}