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