Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- struct list
- {
- char symbol;
- struct list* next;
- struct list* prev;
- };
- void get_list(struct list* p)
- {
- struct list* node = p;
- struct list* pr = NULL;
- char sym;
- node->prev = NULL;
- while ((sym = getchar()) != '.')
- {
- node->symbol = sym;
- pr = node;
- node->next = new struct list;
- node = node->next;
- node->prev = pr;
- }
- node->next = NULL; // Можно было написать в while
- }
- // orig - указатель на начало списка, p - указатель на элемент, начиная с которого удаляем элементы (n штук, включая элемент p)
- void delete_nodes_if_exist(struct list* orig, struct list* p, int n)
- {
- struct list* t = p->prev;
- for (int i = 0; i < n && t != NULL; i++)
- {
- t = t->prev;
- delete t->next;
- }
- if (t == NULL) // если дошли до начала списка, необходимо исправить указатель на начало списка
- {
- orig->prev = NULL;
- orig->symbol = p->symbol;
- orig->next = p->next;
- delete p;
- }
- else // если не дошли, просто изменяем указатели данного нам элемента
- {
- p->prev = t;
- p->prev->next = p; // очень важно, так как список двусвязный, при удалении элементов слева не забыть об изменении правого указателя
- }
- }
- void print_list(struct list* p)
- {
- for (struct list* t = p; t != NULL; t = t->next)
- {
- printf("%c", t->symbol);
- }
- printf("\n");
- }
- int main(void)
- {
- struct list* p = NULL;
- p = new struct list;
- char sym; // Специальный символ
- sym = getchar();
- while (getchar() != '\n'); // Очистка потока
- get_list(p); // create list
- for (struct list* node = p->next; node != NULL; node = node->next) // идём по всем элементам списка
- {
- int n;
- for (n = 0; node->symbol == sym && node != NULL; node = node->next) n++;// если встречаем спец. символ, сразу скачем до конца списка либо до конца подряд идучих спец. символов
- delete_nodes_if_exist(p, node, 2 * n); // двойное n, так как нужно удалить не только буквы, но и спец. символы
- }
- print_list(p);
- delete p;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement