Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.21 KB | None | 0 0
  1. // v18t13.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <string>
  6. #include <iostream>
  7. #include <fstream>
  8.  
  9. using namespace std;
  10.  
  11. // описываем структуру элемента списка
  12. // next - указатель на следующий элемент
  13. // data - данные (фамилия)
  14. struct element {
  15.     element *next;
  16.     element *previous;
  17.     string data;
  18. };
  19.  
  20.  
  21. // указатель на начало списка, с которым будем работать
  22. element *list_first;
  23. // указатель на последний элемент списка. для работы от конца к началу
  24. element *list_last;
  25.  
  26. element *p_left;
  27. element *p_right;
  28.  
  29. // функция добавления нового элемента к списку
  30. void add_to_list(string x) {
  31.     element *p;
  32.     // создаем новый элемент
  33.     p = new element;
  34.     // заполнили его фамилию
  35.     p->data = x;
  36.  
  37.     if (list_first == NULL) {
  38.         // если список был пуст, то просто добавляем элемент, у которого нет
  39.         // ни следующего, ни предыдущего
  40.         list_first = p;
  41.         list_last = p;
  42.         list_first->next = NULL;
  43.         list_first->previous = NULL;
  44.  
  45.     }
  46.     else {
  47.         // первый элемент списка должен смотреть "назад" на наш элемент
  48.         list_first->previous = p;
  49.         // этот элемент будет "смотреть" на "старую" голову списка
  50.         p->next = list_first;
  51.         // новая голова списка там, куда смотрит p
  52.         list_first = p;
  53.         list_first->previous = NULL;
  54.     }
  55. }
  56.  
  57. void print_list() {
  58.     element *p;
  59.     // взяли первый элемент
  60.     p = list_first;
  61.     cout << "Список (в прямом порядке): " << endl;
  62.     // пока список не закончен
  63.  
  64.     if (p == NULL) cout << "Список пуст!" << endl;
  65.     while (p != NULL) {
  66.         cout << p->data << endl;
  67.         // переход к следующему элементу
  68.         p = p->next;
  69.     }
  70.     cout << "Конец списка" << endl;
  71. }
  72.  
  73. void print_list_back() {
  74.     element *p;
  75.     // взяли первый элемент
  76.     p = list_last;
  77.     cout << "Список (в обратном порядке): " << endl;
  78.     // пока список не закончен
  79.  
  80.     if (p == NULL) cout << "Список пуст!" << endl;
  81.     while (p != NULL) {
  82.         cout << p->data << endl;
  83.         // переход к следующему элементу
  84.         p = p->previous;
  85.     }
  86.     cout << "Конец списка" << endl;
  87. }
  88.  
  89. int main()
  90. {
  91.     int command;
  92.  
  93.     setlocale(LC_ALL, "Russian");
  94.  
  95.     // в начале список пуст, голова списка не показывает никуда
  96.     list_first = NULL;
  97.     list_last = NULL;
  98.  
  99.     string s;
  100.     int n;
  101.  
  102.     /*
  103.     Будем считать, что исходные данных находятся в файле, в первой строке которого
  104.     написано количество фамилий, а дальше по 1 фамилии в строке.
  105.     */
  106.  
  107.     ifstream f;
  108.  
  109.     // открыли файл на чтение
  110.     f.open("g:\\names.txt");
  111.  
  112.     while (!f.eof()) {
  113.         getline(f, s);
  114.         add_to_list(s);
  115.     }
  116.  
  117.    
  118.     cout << "Список прочитан из файла" << endl;
  119.  
  120.     do {
  121.  
  122.         cout << "Выберите действие:" << endl;
  123.         cout << "1: Вывод списка (в прямом порядке)" << endl;
  124.         cout << "2: Вывод списка (в обратном порядке)" << endl;
  125.         cout << "3: Удаление самой длинной фамилии" << endl;
  126.         cout << "0: Выход из программы" << endl;
  127.  
  128.         cin >> command;
  129.  
  130.         if (command == 1) {
  131.             print_list();
  132.         }
  133.  
  134.         if (command == 2) {
  135.             print_list_back();
  136.         }
  137.  
  138.         if (command == 3) {
  139.             // поиск наиболее длинной фамилии
  140.             // нам нужно не только саму фамилию, но и указатель на ее элемент
  141.             int max_size = 0;
  142.             element *max_element = NULL;
  143.             element *p = list_first;
  144.  
  145.             while (p != NULL) {
  146.                 if (p->data.size() > max_size) {
  147.                     max_size = p->data.size();
  148.                     max_element = p;
  149.                 }
  150.                 // переходим на следующий элемент
  151.                 p = p->next;
  152.             }
  153.  
  154.             // "формальная" проверка на пустой список
  155.             if (max_element == NULL) {
  156.                 cout << "Список был пуст" << endl;
  157.             }
  158.             else {// когда список не пустой
  159.                 if (max_element->previous == NULL) {
  160.                     // если это первый элемент
  161.                     if (max_element->next == NULL) {
  162.                         // хуже того, он первый и единственный
  163.                         list_first = NULL;
  164.                         list_last = NULL;
  165.                         delete max_element;
  166.                     }
  167.                     else {
  168.                         // или это первый элемент, за которым что-то есть
  169.                         p_right = max_element->next;
  170.                         // взяли элемент справа
  171.                         list_first = p_right;
  172.                         // теперь список начинается со второго элемента
  173.                         p_right->previous = NULL;
  174.                         // у второго элемента больше нет предыдущего
  175.                         delete max_element;
  176.                     }
  177.                 }
  178.                 else {
  179.                     // если это не первый элемент
  180.                     if (max_element->next == NULL) {
  181.                         // но это последний элемент (крайний справа)
  182.                         p_left = max_element->previous;
  183.                         p_left->next = NULL;
  184.                         list_last = p;
  185.                         // отрезаем последний элемент
  186.                         delete max_element;
  187.                     }
  188.                     else {
  189.                         // это элемент из середины списка
  190.                         p_right = max_element->next;
  191.                         p_left = max_element->previous;
  192.  
  193.                         // и передвинули указатели "прыгнув" через удаляемый элемент
  194.                         p_left->next = p_right;
  195.                         p_right->previous = p_left;
  196.  
  197.                         delete max_element;
  198.                     }
  199.                 }
  200.         }
  201.    
  202.             cout << "Удаление выполнено." << endl;
  203.         }
  204.     } while (command != 0);
  205.  
  206.     return 0;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement