Advertisement
MrGhost75

StringLinkedList

Oct 15th, 2020
1,990
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.91 KB | None | 0 0
  1.  
  2. #include <fstream>
  3. #include <cstring>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. struct Node { //Узел двунаправленного списка.
  9.     string value; // Данные.
  10.     Node* next, * prev; //Указатели на следующий и предыдущий элементы двунаправленного списка.
  11. };
  12.  
  13. class MyList { //Двунаправленный список.
  14.  
  15.     // Голова, хвост.
  16.     Node* Head, * Tail;
  17.     // Количество элементов.
  18.     int Count;
  19.  
  20. public:
  21.  
  22.     // Конструктор.
  23.     MyList();
  24.     // Деструктор.
  25.     ~MyList();
  26.  
  27.     // Получить количество.
  28.     int GetCount();
  29.     // Получить элемент списка.
  30.     Node* GetNode(int pos);
  31.  
  32.     // Удалить весь список.
  33.     void DelAll();
  34.     // Удаление элемента, если параметр не указывается,
  35.     // то функция его запрашивает.
  36.     void Del(int pos = 0);
  37.     // Вставка элемента, если параметр не указывается,
  38.     // то функция его запрашивает.
  39.     void Insert(int pos = 0);
  40.  
  41.     // Добавление в конец списка.
  42.     void AddTail(string s);
  43.  
  44.     // Добавление в начало списка.
  45.     void AddHead(string s);
  46.  
  47.     // Печать списка.
  48.     void Print();
  49.  
  50.     // Печать списка в обратном порядке.
  51.     void ReversePrint();
  52.  
  53.     // Печать определенного элемента.
  54.     void Print(int pos);
  55. };
  56.  
  57. MyList::MyList() {
  58.     // Изначально список пуст.
  59.     Head = Tail = NULL;
  60.     Count = 0;
  61. }
  62.  
  63. MyList::~MyList() {
  64.     // Удаляем все элементы.
  65.     DelAll();
  66. }
  67.  
  68. //P.S. Данная функция не была использована в программе, но была в списке обязательных функций.
  69. void MyList::AddHead(string s) {
  70.     // Новый элемент.
  71.     Node* temp = new Node;
  72.  
  73.     // Предыдущего нет.
  74.     temp->prev = 0;
  75.     // Заполняем данные.
  76.     temp->value = s;
  77.     // Следующий - бывшая голова.
  78.     temp->next = Head;
  79.  
  80.     // Если элементы есть?
  81.     if (Head != 0)
  82.         Head->prev = temp;
  83.  
  84.     // Если элемент первый, то он одновременно и голова и хвост.
  85.     if (Count == 0)
  86.         Head = Tail = temp;
  87.     else
  88.         // Иначе новый элемент - головной.
  89.         Head = temp;
  90.  
  91.     Count++;
  92. }
  93.  
  94. void MyList::AddTail(string s) {
  95.     // Создаем новый элемент.
  96.     Node* temp = new Node;
  97.     // Следующего нет.
  98.     temp->next = 0;
  99.     // Заполняем данные.
  100.     temp->value = s;
  101.     // Предыдущий - бывший хвост.
  102.     temp->prev = Tail;
  103.  
  104.     // Если элементы есть?
  105.     if (Tail != 0)
  106.         Tail->next = temp;
  107.  
  108.     // Если элемент первый, то он одновременно и голова и хвост.
  109.     if (Count == 0)
  110.         Head = Tail = temp;
  111.     else
  112.         // Иначе новый элемент - хвостовой.
  113.         Tail = temp;
  114.  
  115.     Count++;
  116. }
  117.  
  118. //P.S. Данная функция не была использована в программе, но была в списке обязательных функций.
  119. void MyList::Insert(int pos) {
  120.     // Если параметр отсутствует или равен 0, то запрашиваем его.
  121.     if (pos == 0) {
  122.         cout << "Input position: ";
  123.         cin >> pos;
  124.     }
  125.  
  126.     // Позиция от 1 до Count?
  127.     if (pos < 1 || pos > Count + 1) {
  128.         // Неверная позиция.
  129.         cout << "Incorrect position !!!\n";
  130.         return;
  131.     }
  132.  
  133.     // Если вставка в конец списка.
  134.     if (pos == Count + 1) {
  135.         // Вставляемые данные.
  136.         string data;
  137.         cout << "Input new string: ";
  138.         cin >> data;
  139.         // Добавление в конец списка.
  140.         AddTail(data);
  141.         return;
  142.     }
  143.     else if (pos == 1) {
  144.         // Вставляемые данные.
  145.         string data;
  146.         cout << "Input new string: ";
  147.         cin >> data;
  148.         // Добавление в начало списка.
  149.         AddHead(data);
  150.         return;
  151.     }
  152.  
  153.     // Счетчик.
  154.     int i = 1;
  155.  
  156.     // Отсчитываем от головы n - 1 элементов.
  157.     Node* Ins = Head;
  158.  
  159.     while (i < pos) {
  160.         // Доходим до элемента,
  161.         // перед которым вставляемся.
  162.         Ins = Ins->next;
  163.         i++;
  164.     }
  165.  
  166.     // Доходим до элемента,
  167.     // который предшествует.
  168.     Node* PrevIns = Ins->prev;
  169.  
  170.     // Создаем новый элемент.
  171.     Node* temp = new Node;
  172.  
  173.     // Вводим данные.
  174.     cout << "Input new string: ";
  175.     cin >> temp->value;
  176.  
  177.     // Настройка связей.
  178.     //if (PrevIns != 0 && Count != 1)
  179.     PrevIns->next = temp;
  180.  
  181.     temp->next = Ins;
  182.     temp->prev = PrevIns;
  183.     Ins->prev = temp;
  184.  
  185.     Count++;
  186. }
  187.  
  188. void MyList::Del(int pos) {
  189.     // Если параметр отсутствует или равен 0, то запрашиваем его.
  190.     if (pos == 0) {
  191.         cout << "Input position: ";
  192.         cin >> pos;
  193.     }
  194.     // Позиция от 1 до Count?
  195.     if (pos < 1 || pos > Count) {
  196.         // Неверная позиция.
  197.         cout << "Incorrect position !!!\n";
  198.         return;
  199.     }
  200.  
  201.     // Счетчик.
  202.     int i = 1;
  203.  
  204.     Node* Del = Head;
  205.  
  206.     while (i < pos) {
  207.         // Доходим до элемента,
  208.         // который удаляется.
  209.         Del = Del->next;
  210.         i++;
  211.     }
  212.  
  213.     // Доходим до элемента,
  214.     // который предшествует удаляемому.
  215.     Node* PrevDel = Del->prev;
  216.     // Доходим до элемента, который следует за удаляемым.
  217.     Node* AfterDel = Del->next;
  218.  
  219.     // Если удаляем не голову.
  220.     if (PrevDel != 0 && Count != 1)
  221.         PrevDel->next = AfterDel;
  222.     // Если удаляем не хвост.
  223.     if (AfterDel != 0 && Count != 1)
  224.         AfterDel->prev = PrevDel;
  225.  
  226.     // Удаляются крайние?
  227.     if (pos == 1)
  228.         Head = AfterDel;
  229.     if (pos == Count)
  230.         Tail = PrevDel;
  231.  
  232.     // Удаление элемента.
  233.     delete Del;
  234.  
  235.     Count--;
  236. }
  237.  
  238. void MyList::Print(int pos) {
  239.     // Позиция от 1 до Count?
  240.     if (pos < 1 || pos > Count) {
  241.         // Неверная позиция.
  242.         cout << "Incorrect position !!!\n";
  243.         return;
  244.     }
  245.  
  246.     Node* temp;
  247.  
  248.     // Определяем с какой стороны
  249.     // быстрее двигаться.
  250.     if (pos <= Count / 2) {
  251.         // Отсчет с головы.
  252.         temp = Head;
  253.         int i = 1;
  254.  
  255.         while (i < pos) {
  256.             // Двигаемся до нужного элемента.
  257.             temp = temp->next;
  258.             i++;
  259.         }
  260.     }
  261.     else {
  262.         // Отсчет с хвоста.
  263.         temp = Tail;
  264.         int i = 1;
  265.  
  266.         while (i <= Count - pos) {
  267.             // Двигаемся до нужного элемента.
  268.             temp = temp->prev;
  269.             i++;
  270.         }
  271.     }
  272.     // Вывод элемента.
  273.     cout << temp->value << endl;
  274. }
  275.  
  276. void MyList::Print() {
  277.     // Если в списке присутствуют элементы, то пробегаем по нему
  278.     // и печатаем элементы, начиная с головного.
  279.     if (Count != 0) {
  280.  
  281.         Node* temp = Head;
  282.  
  283.         cout << "( ";
  284.  
  285.         while (temp->next != 0) {
  286.             cout << temp->value << ", ";
  287.             temp = temp->next;
  288.         }
  289.  
  290.         cout << temp->value << " )\n";
  291.     }
  292. }
  293.  
  294. void MyList::ReversePrint() {
  295.     // Если в списке присутствуют элементы, то пробегаем по нему
  296.     // и печатаем элементы, начиная с головного.
  297.     if (Count != 0) {
  298.  
  299.         Node* temp = Tail;
  300.  
  301.         cout << "( ";
  302.  
  303.         while (temp->prev != 0) {
  304.             cout << temp->value << ", ";
  305.             temp = temp->prev;
  306.         }
  307.  
  308.         cout << temp->value << " )\n";
  309.     }
  310. }
  311.  
  312.  
  313. void MyList::DelAll() {
  314.     // Пока остаются элементы, удаляем по одному с головы.
  315.     while (Count != 0)
  316.         Del(1);
  317. }
  318.  
  319. int MyList::GetCount() {
  320.     return Count;
  321. }
  322.  
  323. Node* MyList::GetNode(int pos) {
  324.  
  325.     Node* temp = Head;
  326.  
  327.     // Позиция от 1 до Count?
  328.     if (pos < 1 || pos > Count)
  329.     {
  330.         // Неверная позиция.
  331.         cout << "Incorrect position !!!\n";
  332.         return 0;
  333.     }
  334.  
  335.     int i = 1;
  336.     // Ищем нужный нам элемент.
  337.     while (i < pos && temp != 0)
  338.     {
  339.         temp = temp->next;
  340.         i++;
  341.     }
  342.  
  343.     if (temp == 0)
  344.         return 0;
  345.     else
  346.         return temp;
  347. }
  348.  
  349.  
  350. //ГЛАВНАЯ ФУНКЦИЯ.
  351. int main() {
  352.  
  353.     setlocale(LC_ALL, "rus");
  354.  
  355.     MyList listOfStrings; //Список с номерами поездов и кол-вами свободных мест в вагонах.
  356.  
  357.     string s;
  358.  
  359.     for (int i = 0; i < 5; i++) {
  360.         cout << "\nAdd a string: ";
  361.         cin >> s;
  362.         listOfStrings.AddTail(s);
  363.     }
  364.     listOfStrings.Print();
  365.  
  366.  
  367.     listOfStrings.Insert(3);
  368.     listOfStrings.Insert(4);
  369.     listOfStrings.Print();
  370.  
  371.     listOfStrings.Del(3);
  372.     listOfStrings.Del(1);
  373.     listOfStrings.Print();
  374.  
  375.     listOfStrings.ReversePrint();
  376.  
  377.     system("pause");
  378.     return 0;
  379. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement