CCCPaste

DSA_PracticalTask_P1

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