Advertisement
Guest User

JustForLulZ

a guest
Feb 18th, 2020
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct list
  5. {
  6.    char symbol;
  7.    struct list* next;
  8.    struct list* prev;
  9. };
  10.  
  11. void get_list(struct list* p)
  12. {
  13.    struct list* node = p;
  14.    struct list* pr = NULL;
  15.    char sym;
  16.    node->prev = NULL;
  17.  
  18.    while ((sym = getchar()) != '.')
  19.    {
  20.       node->symbol = sym;
  21.       pr = node;
  22.       node->next = new struct list;
  23.       node = node->next;
  24.       node->prev = pr;
  25.    }
  26.    node->next = NULL; // Можно было написать в while
  27. }
  28.  
  29. // orig - указатель на начало списка, p - указатель на элемент, начиная с которого удаляем элементы (n штук, включая элемент p)
  30. void delete_nodes_if_exist(struct list* orig, struct list* p, int n)
  31. {
  32.     struct list* t = p->prev;
  33.     for (int i = 0; i < n && t != NULL; i++)
  34.     {
  35.         t = t->prev;
  36.         delete t->next;
  37.     }
  38.     if (t == NULL) // если дошли до начала списка, необходимо исправить указатель на начало списка
  39.     {
  40.         orig->prev = NULL;
  41.         orig->symbol = p->symbol;
  42.         orig->next = p->next;
  43.         delete p;
  44.     }
  45.     else // если не дошли, просто изменяем указатели данного нам элемента
  46.     {
  47.         p->prev = t;
  48.         p->prev->next = p; // очень важно, так как список двусвязный, при удалении элементов слева не забыть об изменении правого указателя
  49.     }
  50. }
  51.  
  52. void print_list(struct list* p)
  53. {
  54.    for (struct list* t = p; t != NULL; t = t->next)
  55.    {
  56.        printf("%c", t->symbol);
  57.    }
  58.    printf("\n");
  59. }
  60.  
  61. int main(void)
  62. {
  63.       struct list* p = NULL;
  64.       p = new struct list;
  65.       char sym; // Специальный символ
  66.  
  67.       sym = getchar();
  68.  
  69.       while (getchar() != '\n'); // Очистка потока
  70.  
  71.       get_list(p); // create list
  72.      
  73.       for (struct list* node = p->next; node != NULL; node = node->next) // идём по всем элементам списка
  74.       {
  75.          int n;
  76.          for (n = 0; node->symbol == sym && node != NULL; node = node->next) n++;// если встречаем спец. символ, сразу скачем до конца списка либо до конца подряд идучих спец. символов
  77.          delete_nodes_if_exist(p, node, 2 * n); // двойное n, так как нужно удалить не только буквы, но и спец. символы
  78.       }
  79.        
  80.       print_list(p);
  81.       delete p;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement