#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("Уникальные элементы не были обнаружены.");
}