Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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("Пустой список");
- }
Add Comment
Please, Sign In to add comment