fork(1) download
  1. #include <iostream>
  2.  
  3. struct cnode {
  4. char ch;
  5. cnode* next;
  6. };
  7.  
  8. struct clist {
  9. cnode* head;
  10. cnode* tail;
  11. };
  12.  
  13. void clist_init(clist* lst);
  14. bool clist_add(clist* lst, char ch);
  15. void clist_println(std::ostream& _out, const clist* lst);
  16. void clist_clear(clist* lst);
  17.  
  18. //удаление символа(ов) - fch, перед символом - lch
  19. void clist_delete(clist* lst, char fch, char lch){
  20. cnode* p, *a, *b, *t, *prev;
  21. if(lst->head == NULL)
  22. return;
  23.  
  24. p = lst->head;
  25. do {
  26. if(p->ch == fch){
  27. b = p;
  28. do {
  29. if(b->next->ch == lch){
  30. b = b->next;
  31. break;
  32. }
  33. b = b->next;
  34. } while((b != lst->head) && (b->ch == fch));
  35.  
  36. if(b->ch == lch){
  37. a = p;
  38. if(p == lst->head){
  39. lst->head = b;
  40. lst->tail->next = b;
  41. } else {
  42. if(b == lst->head){
  43. lst->tail = prev;
  44. lst->tail->next = lst->head;
  45. } else
  46. prev->next = b;
  47. }
  48.  
  49. while(a != b){
  50. t = a;
  51. a = a->next;
  52. delete t;
  53. }
  54. p = prev = b;
  55. }
  56. }
  57. prev = p;
  58. p = p->next;
  59. } while(p != lst->head);
  60. }
  61.  
  62.  
  63. int main(void){
  64. clist lst;
  65. clist_init(&lst);
  66.  
  67. char s[] = "EEENENEEEEEEN, [EEEN] <EN>EEENEE";
  68. for(const char* p = &s[0]; *p; ++p)
  69. clist_add(&lst, *p);
  70.  
  71. clist_println(std::cout, &lst);
  72. clist_delete(&lst, 'E', 'N');
  73. clist_println(std::cout, &lst);
  74.  
  75. clist_clear(&lst);
  76. return 0;
  77. }
  78.  
  79. //инициализация кольцевого-списка
  80. void clist_init(clist* lst){
  81. lst->head = lst->tail = NULL;
  82. }
  83.  
  84. //добавление в конец кольцевого-списка
  85. bool clist_add(clist* lst, char ch){
  86. cnode* p = new (std::nothrow) cnode();
  87. if(p != NULL){
  88. p->ch = ch;
  89. if(lst->head == NULL){
  90. p->next = p;
  91. lst->head = lst->tail = p;
  92. } else {
  93. p->next = lst->head;
  94. lst->tail->next = p;
  95. lst->tail = p;
  96. }
  97. }
  98. return (p != NULL);
  99. }
  100.  
  101. //вывод кольцевого-списка в выходной поток
  102. void clist_println(std::ostream& _out, const clist* lst){
  103. const cnode* p, *e;
  104. if(lst->head != NULL){
  105. p = e = lst->head;
  106. do {
  107. _out << p->ch;
  108. p = p->next;
  109. } while(p != e);
  110. _out << std::endl;
  111. }
  112. }
  113.  
  114. //уадление кольцевого-списка
  115. void clist_clear(clist* lst){
  116. cnode* t, *e, *p;
  117. if(lst->head != NULL){
  118. p = e = lst->head;
  119. do {
  120. t = p;
  121. p = p->next;
  122. delete t;
  123. } while(p != e);
  124. lst->head = lst->tail = NULL;
  125. }
  126. }
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
EEENENEEEEEEN, [EEEN] <EN>EEENEE
NNN, [N] <N>N