Advertisement
Domerk

Списки_Дима

Dec 11th, 2013
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.20 KB | None | 0 0
  1. /*вставить в список L новый элемент Е1
  2. перед каждым вхождением элемента Е, если Е входит в L
  3. юзер задает сначала список, потом элементы е и е1*/
  4.  
  5. //======================================== main.cpp ========================================
  6.  
  7. #include <iostream> //стандартная библиотека для работы с потоками ввода-вывода
  8. #include "func.h" //подключаем наш заголовочный файл
  9.  
  10. using namespace std; //используем стандартное пространство имён
  11.  
  12. int main ()
  13. {
  14.     int key = 1; // кнопочка
  15.     int i = 0; // счётчик
  16.     char value, e, e1; // всякие ещё переменные
  17.     elements* head = 0; // голова, пока ни на что не указывает
  18.     cout<<"Key = 0 -> Exit"<<endl<<"Key = 1 -> Continue"<<endl<<endl; // всякая инфа для юзера
  19.  
  20.     while (key) //в зависимости от значения кнопки
  21.     {
  22.         cout<<"New value: "; // просим ввести новое значение
  23.         cin>>value; //считываем с клавы
  24.         insert (head, value); // добавляем в списочек
  25.         if (i>=4) //если у нас уже больше 4-х элементов
  26.         {
  27.             cout<<"Key: "; //то предлагаем выйти или продолжить
  28.             cin>>key; //считываем кнопочку
  29.         }
  30.         i++; //увеличиваем счётчик
  31.         cout<<endl; //выводим пустой абзац для красоты
  32.     }
  33.     cout<<"Element E: "; //узнаём, перед чем вставлять
  34.     cin>>e;
  35.     cout<<"Element E1: "; // и что вставлять
  36.     cin>>e1;
  37.  
  38.     print (head); //печатаем
  39.     handling (head, e, e1); //вызываем функцию-вставлятор
  40.  
  41.     cout<<endl; //абзац
  42.  
  43.     print (head); //опять печатаем
  44.     erase(head); // удаляем
  45.  
  46.     cin.sync(); //задержка
  47.     cin.clear();
  48.     cin.get();
  49.  
  50.     return 0; //всё! :)
  51. }
  52.  
  53. //======================================== func.h =====================================
  54.  
  55. #ifndef FUNC_H
  56. #define FUNC_H
  57.  
  58.  
  59. struct elements; //объявляем структуру "элемент", чтобы можно было делать ссылку на неё
  60.  
  61. struct elements //сама структура
  62. {                    
  63.         char inf; //некая инфа - выбираем Char, так как это просто символы
  64.         elements* ref; //ссылка на следующий элменет
  65. };
  66.  
  67. // объявляем функции, которые нам понадобятся
  68. void insert (elements*& head, char value);
  69. void handling (elements*& head, char e, char e1);
  70. void print (elements* head);
  71. void erase (elements*& head);
  72. int length (elements* head);
  73. elements* insert_new(elements*& head, int place, char value);
  74.  
  75.  
  76.  
  77. #endif
  78.  
  79. //======================================== func.cpp ===================================
  80.  
  81. #include "func.h" // подключаем заголовчный файл
  82. #include <iostream> //и библиотеку для воода-вывода
  83.  
  84. using namespace std; //пространство имён
  85.  
  86. // создание списка
  87. void insert(elements*& head, char value)
  88. {
  89.         elements*p=new elements; //создаём новый элемент
  90.         p->inf=value; //заполняем инфу
  91.         p->ref=head; //делаем ссылку - вставляем в голову
  92.         head=p;
  93. }
  94.  
  95. // печать списка
  96. void print(elements* head)
  97. {
  98.     while(head)                           // пока элемент существует
  99.         {
  100.                 cout << head->inf << " ";       // вывести его инфу
  101.                 head = head->ref;                   // перейти к следующему
  102.         }
  103. }
  104.  
  105. // удаление списка
  106. void erase(elements*& head)
  107. {
  108.         elements* th;                      // вспомогательный указатель
  109.         while(head)                           // пока есть текущий элемент
  110.         {
  111.                 th = head->ref;                  // запоминаем следующий элемент
  112.                 delete head;                      // удаляем текущий
  113.                 head = th;                        // переходим к следующему
  114.         }
  115. }
  116.  
  117. // определение длины
  118. int length (elements* head)
  119. {
  120.     int i=0;
  121.     while(head)                           // пока элемент существует
  122.         {
  123.                 head = head->ref;            // перейти к следующему
  124.            i++;                 // увеличиваем счётчик
  125.         }
  126.     return i; // возвращаем то, что нашли
  127. }
  128.  
  129.  
  130. // обработка списка
  131. void handling (elements*& head, char e, char e1)
  132. {
  133.     if (!head) // если головы нет
  134.     {
  135.         cout<<"List does not exist"<<endl; // список пуст
  136.         return; // выходим
  137.     }
  138.  
  139.     elements* p = head; // создаём элемент
  140.     int i = 1; // счётчик
  141.     int n = 0; // ещё счётчик
  142.     int l = length(head); // узнаём длину
  143.     cout<<endl<<endl<<"Length: "<<l<<endl; // выводим длину
  144.    
  145.     while (p) // пока элемент существует
  146.         {
  147.                 if (e==p->inf) // если нашли совпадение
  148.                     {
  149.                         cout<<endl<<"Element: "<<p->inf<<endl<<endl; // сообщаем об этом
  150.                         insert_new(head, i-1, e1); // передаём в добовлятор голову, позицию вставки и то, что надо вставить
  151.                         n++; // полюс 1
  152.                         i++; // плюс 1 - т.к. при вставлении длина увеличивается, компенсируем
  153.                 }
  154.                 p=p->ref;                   // перейти к следующему
  155.                 i++; // плюс один
  156.         }
  157.     if (n) // если совпадения были
  158.     {
  159.     l = length(head); // узнаём новую длину
  160.     cout<<"New length: "<<l<<endl; // сообщаем об этом
  161.     }
  162.     else // иначе
  163.     {
  164.         cout<<"Not element!"<<endl; // сообщаем, что ничего не вставили, так как совпадений нет
  165.     }
  166.    
  167.  
  168. }
  169.  
  170.  
  171. // вставка элемента, head - указатель на голову, place - позиция вставки, value - число, которое нужно вставить
  172. elements* insert_new(elements*& head, int place, char value)
  173. {
  174.                 elements *p1 = head, *p2 = head, *p = 0; //до чего вставляем, после чего вставляем, что вставляем
  175.                 for(int i = 0; i < place; ++i) // пока не нашли позицию
  176.                         if(p2)                     // если текущий элемент есть
  177.                         {
  178.                                 p1 = p2;               // текущий -> предыдущий
  179.                                 p2 = (*p2).ref;         // следующий -> текущий (запись (*p2).ref эквивалентна p2->ref, можно использовать и то, и то
  180.                                                         // тут делаем так, чтобы показать, что и этот способ мимо не прошёл :)
  181.                         }
  182.                         else return 0;             // иначе вставить не удалось
  183.                 p = new elements;             // создаем новый элемент
  184.                 (*p).inf = value;             // с нужной инфой
  185.                 if(place == 0) head = p;      // если вставляем после головы, указываем ей на новый элемент
  186.                 else (*p1).ref = p;            // иначе - указываем предыдущим на него
  187.                 (*p).ref = p2;                 // указываем вставленным элементом на следущий
  188.                 return p;                     // ура
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement