#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("Пустой список");
}