Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*вставить в список L новый элемент Е1
- перед каждым вхождением элемента Е, если Е входит в L
- юзер задает сначала список, потом элементы е и е1*/
- //======================================== main.cpp ========================================
- #include <iostream> //стандартная библиотека для работы с потоками ввода-вывода
- #include "func.h" //подключаем наш заголовочный файл
- using namespace std; //используем стандартное пространство имён
- int main ()
- {
- int key = 1; // кнопочка
- int i = 0; // счётчик
- char value, e, e1; // всякие ещё переменные
- elements* head = 0; // голова, пока ни на что не указывает
- cout<<"Key = 0 -> Exit"<<endl<<"Key = 1 -> Continue"<<endl<<endl; // всякая инфа для юзера
- while (key) //в зависимости от значения кнопки
- {
- cout<<"New value: "; // просим ввести новое значение
- cin>>value; //считываем с клавы
- insert (head, value); // добавляем в списочек
- if (i>=4) //если у нас уже больше 4-х элементов
- {
- cout<<"Key: "; //то предлагаем выйти или продолжить
- cin>>key; //считываем кнопочку
- }
- i++; //увеличиваем счётчик
- cout<<endl; //выводим пустой абзац для красоты
- }
- cout<<"Element E: "; //узнаём, перед чем вставлять
- cin>>e;
- cout<<"Element E1: "; // и что вставлять
- cin>>e1;
- print (head); //печатаем
- handling (head, e, e1); //вызываем функцию-вставлятор
- cout<<endl; //абзац
- print (head); //опять печатаем
- erase(head); // удаляем
- cin.sync(); //задержка
- cin.clear();
- cin.get();
- return 0; //всё! :)
- }
- //======================================== func.h =====================================
- #ifndef FUNC_H
- #define FUNC_H
- struct elements; //объявляем структуру "элемент", чтобы можно было делать ссылку на неё
- struct elements //сама структура
- {
- char inf; //некая инфа - выбираем Char, так как это просто символы
- elements* ref; //ссылка на следующий элменет
- };
- // объявляем функции, которые нам понадобятся
- void insert (elements*& head, char value);
- void handling (elements*& head, char e, char e1);
- void print (elements* head);
- void erase (elements*& head);
- int length (elements* head);
- elements* insert_new(elements*& head, int place, char value);
- #endif
- //======================================== func.cpp ===================================
- #include "func.h" // подключаем заголовчный файл
- #include <iostream> //и библиотеку для воода-вывода
- using namespace std; //пространство имён
- // создание списка
- void insert(elements*& head, char value)
- {
- elements*p=new elements; //создаём новый элемент
- p->inf=value; //заполняем инфу
- p->ref=head; //делаем ссылку - вставляем в голову
- head=p;
- }
- // печать списка
- void print(elements* head)
- {
- while(head) // пока элемент существует
- {
- cout << head->inf << " "; // вывести его инфу
- head = head->ref; // перейти к следующему
- }
- }
- // удаление списка
- void erase(elements*& head)
- {
- elements* th; // вспомогательный указатель
- while(head) // пока есть текущий элемент
- {
- th = head->ref; // запоминаем следующий элемент
- delete head; // удаляем текущий
- head = th; // переходим к следующему
- }
- }
- // определение длины
- int length (elements* head)
- {
- int i=0;
- while(head) // пока элемент существует
- {
- head = head->ref; // перейти к следующему
- i++; // увеличиваем счётчик
- }
- return i; // возвращаем то, что нашли
- }
- // обработка списка
- void handling (elements*& head, char e, char e1)
- {
- if (!head) // если головы нет
- {
- cout<<"List does not exist"<<endl; // список пуст
- return; // выходим
- }
- elements* p = head; // создаём элемент
- int i = 1; // счётчик
- int n = 0; // ещё счётчик
- int l = length(head); // узнаём длину
- cout<<endl<<endl<<"Length: "<<l<<endl; // выводим длину
- while (p) // пока элемент существует
- {
- if (e==p->inf) // если нашли совпадение
- {
- cout<<endl<<"Element: "<<p->inf<<endl<<endl; // сообщаем об этом
- insert_new(head, i-1, e1); // передаём в добовлятор голову, позицию вставки и то, что надо вставить
- n++; // полюс 1
- i++; // плюс 1 - т.к. при вставлении длина увеличивается, компенсируем
- }
- p=p->ref; // перейти к следующему
- i++; // плюс один
- }
- if (n) // если совпадения были
- {
- l = length(head); // узнаём новую длину
- cout<<"New length: "<<l<<endl; // сообщаем об этом
- }
- else // иначе
- {
- cout<<"Not element!"<<endl; // сообщаем, что ничего не вставили, так как совпадений нет
- }
- }
- // вставка элемента, head - указатель на голову, place - позиция вставки, value - число, которое нужно вставить
- elements* insert_new(elements*& head, int place, char value)
- {
- elements *p1 = head, *p2 = head, *p = 0; //до чего вставляем, после чего вставляем, что вставляем
- for(int i = 0; i < place; ++i) // пока не нашли позицию
- if(p2) // если текущий элемент есть
- {
- p1 = p2; // текущий -> предыдущий
- p2 = (*p2).ref; // следующий -> текущий (запись (*p2).ref эквивалентна p2->ref, можно использовать и то, и то
- // тут делаем так, чтобы показать, что и этот способ мимо не прошёл :)
- }
- else return 0; // иначе вставить не удалось
- p = new elements; // создаем новый элемент
- (*p).inf = value; // с нужной инфой
- if(place == 0) head = p; // если вставляем после головы, указываем ей на новый элемент
- else (*p1).ref = p; // иначе - указываем предыдущим на него
- (*p).ref = p2; // указываем вставленным элементом на следущий
- return p; // ура
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement