#include <conio.h>
#include <stdio.h>
#include <locale.h>
#include <windows.h>

struct list
{
   list(char _elem = 0, list *_next = NULL, list *_prev = NULL) : elem(_elem), next(_next), prev(_prev) { }
   
   char elem;
   list *next, *prev;
};

void print(list *l, ULONGLONG n);
char input(const char *path, list *l, ULONGLONG *n);
ULONGLONG delete_neighbourses(list **l, ULONGLONG n);

int main()
{
   setlocale(0, "");

   ULONGLONG n = 0;
   list *L = new list();
   char r = input("symbols.txt", L, &n);
   
   if (r != -1)
      print(L, n - delete_neighbourses(&L, n));

   return r != -1 ? 0 * _getch() : -1;
}

char input(const char *path, list *l, ULONGLONG *n)
{
   FILE *stream = NULL;
   fopen_s(&stream, path, "r");

   if (stream)
   {
      char elem = 0;
      list *t = NULL;

      bool read = true;
      for (list *p = l; read; )
      {
         if (read = fscanf_s(stream, "%c", &elem, 1) != EOF)
         {
            p->next = t;
            p = t ? p->next : p;

            p->elem = elem;
            t = new list(0, NULL, p);

            (*n)++;
         }
         else
         {
            p->next = l;
            l->prev = p;
         }
      }

      return 0;
   }
   else
   {
      perror("Не удалось считать файл по причине");
      return -1;
   }
}

ULONGLONG delete_neighbourses(list **l, ULONGLONG n)
{
   ULONGLONG d = 0, i = 0;
   for (list **p = l; n - d > 2 && i != n; )
   {
      if ((*p)->prev->elem == (*p)->next->elem)
      {
         list *t = *p; // Элемент на удаление
         *p = (*p)->next; // Текущий элемент - следующий

         if (*l == t) *l = *p;

         t->prev->next = (*p); // У предыдущего новая ссылка на следующий
         (*p)->prev = t->prev; // У следующего ссылка на предыдущий - предыдущий удаленного

         delete t;
         d++;
      }
      else
      {
         p = &(*p)->next;
         i++;
      }
   }

   return d;
}

void print(list *l, ULONGLONG n)
{
   printf_s("Результат программы: \n");
   if (n)
      for (list *p = l; n; p = p->next, n--)
        printf_s("%c", p->elem);
   else
      printf_s("Пустой список");
}