Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.43 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <iostream>
  3.  using namespace std;
  4.  
  5. struct Node                             //Структура, являющаяся звеном списка
  6.  {
  7.      string Surname;
  8.     string Name;
  9.     int Height;
  10.     int Age;                           //Значение x будет передаваться в список
  11.      Node *Next, *Prev;                 //Указатели на адреса следующего и предыдущего элементов списка
  12.  };
  13.  
  14.  class List                              //Создаем тип данных Список
  15.  {
  16.      Node *Head, *Tail;                 //Указатели на адреса начала списка и его конца
  17.  public:
  18.      List():Head(NULL),Tail(NULL){};    //Инициализируем адреса как пустые
  19.      ~List();                           //Прототип деструктора
  20.      int x, count_;
  21.      void Show();                       //Прототип функции отображения списка на экране
  22.      void Del(int);
  23.      void Add(string Name, string Surname, int Height, int Age);                  
  24.      void Insert(Node &node, int index);
  25.      void Clear();
  26.      int GetLen();
  27.    Node* Get(int index);
  28.  };
  29.  
  30. List::~List()                           //Деструктор
  31.  {
  32.      while (Head)                       //Пока по адресу на начало списка что-то есть
  33.      {
  34.          Tail = Head->Next;             //Резервная копия адреса следующего звена списка
  35.          delete Head;                   //Очистка памяти от первого звена
  36.          Head = Tail;                   //Смена адреса начала на адрес следующего элемента
  37.      }
  38.  }
  39.  
  40.  void List::Clear()
  41. {
  42.     while(Head)
  43.     {
  44.         Tail = Head->Next;
  45.         delete Head;
  46.         Head = Tail;
  47.     }
  48. }
  49.  
  50.  int List::GetLen()
  51. {
  52.     Node *temp = Head;
  53.     int i(0);
  54.    
  55.     while(temp)
  56.     {
  57.         i++;
  58.         temp = temp->Next;
  59.     }
  60.  
  61.     return i;
  62. }
  63.  
  64.   Node* List::Get(int index)
  65. {
  66.     Node *temp = Head;
  67.     int i=0;  
  68.     while(temp && i<index)
  69.     {
  70.         temp = temp->Next;
  71.         i++;
  72.     }
  73.     return temp;
  74. }
  75.  
  76.  void List::Add(string Name, string Surname, int Height, int Age)
  77.  {
  78.    Node *temp = new Node;               //Выделение памяти под новый элемент структуры
  79.    temp->Next = NULL;                   //Указываем, что изначально по следующему адресу пусто
  80.    temp->Name = Name;                         //Записываем значение в структуру
  81.  temp->Surname = Surname;
  82.  temp->Height = Height;
  83.  temp->Age = Age;
  84.    if (Head != NULL)                    //Если список не пуст
  85.    {
  86.        temp->Prev = Tail;               //Указываем адрес на предыдущий элемент в соотв. поле
  87.        Tail->Next = temp;               //Указываем адрес следующего за хвостом элемента
  88.        Tail = temp;                     //Меняем адрес хвоста
  89.    }
  90.    else //Если список пустой
  91.    {
  92.        temp->Prev = NULL;               //Предыдущий элемент указывает в пустоту
  93.        Head = Tail = temp;              //Голова=Хвост=тот элемент, что сейчас добавили
  94.    }
  95.  }
  96.  
  97.  void List::Show()
  98.  {
  99. //ВЫВОДИМ СПИСОК С КОНЦА
  100.     Node *temp=Tail;                   //Временный указатель на адрес последнего элемента
  101.  
  102.   /*   while (temp != NULL)               //Пока не встретится пустое значение
  103.      {
  104.          cout << temp->Name << " "<< temp->Surname << " "<< temp->Height << " "<< temp->Age << " ";        //Выводить значение на экран
  105.          temp = temp->Prev;             //Указываем, что нужен адрес предыдущего элемента
  106.      }
  107.      cout << "\n";
  108.  */
  109.  //ВЫВОДИМ СПИСОК С НАЧАЛА
  110.    
  111.    
  112.      temp = Head;                       //Временно указываем на адрес первого элемента
  113.       while (temp != NULL)              //Пока не встретим пустое значение
  114.      {
  115.          cout << temp->Name << " "<< temp->Surname << "   "<< temp->Height << "  "<< temp->Age << " ";        //Выводим каждое считанное значение на экран
  116.          temp = temp->Next;             //Смена адреса на адрес следующего элемента
  117.      }
  118.      cout << "\n";
  119.  }
  120.  
  121.   void List::Del(int x){
  122.                             //Если удаляем первый элемент, то могут быть такие варианты
  123.                             //В списке есть только первый, в списке есть несколько элементов
  124.                             //Поэтому разбиваем логику выполнения
  125.             if ((x == 1) and (Head->Next)){                     //Если удаляем первый, но есть и другие, то
  126.                 Node *temp = Head;                          //Указываем, что нам нужно начало списка
  127.                 Head = Head->Next;                              //Сдвигаем начало на следующий за началом элемент
  128.                 Head->Prev = NULL;                              //Делаем так, чтоб предыдущий началу элемент был пустым
  129.                 delete temp;                                    //Удаляем удаляемое начало
  130.                 count_--;                                       //Обязательно уменьшаем счетчик
  131.                 return ;                                        //И выходим из функции
  132.             } else if ((x == 1) and (Head == Tail)){            //Если удаляем первый, но в списке только 1 элемент
  133.  
  134.                 Head->Next = NULL;                              //обнуляем все что нужно
  135.                 Head = NULL;
  136.                 delete Head;                                    //Удаляем указатель на начало
  137.                 count_ = 0;                                     //Обязательно обозначаем, что в списке ноль элементов
  138.                 return;                                         //и выходим из функции
  139.             }
  140.  
  141.         //Также может быть, что удаляемый элемент является последним элементом списка
  142.         if (x==count_){
  143.             Node *temp = Tail;                              //Указываем, что нам нужен хвост
  144.             Tail = Tail->Prev;                                  //Отодвигаем хвост немного назад
  145.             Tail->Next = NULL;                                  //Обозначаем, что впереди за хвостом пусто
  146.             delete temp;                                        //Очищаем память от бывшего хвоста
  147.             count_--;                                           //Обязательно уменьшаем счетчик элементов
  148.                 return;                                         //И выходим из функции
  149.             }
  150.  
  151.         //Если же удаляемый элемент лежит где-то в середине списка, то тогда его можно удалить
  152.  
  153.         Node *temp = Head, *temp2;                        //temp-Удаляемый элемент, temp2 нужен, чтобы не потерять данные
  154.  
  155.             //cout<<count_<<"\n";
  156.               for (int i=0; i<x-1; i++) temp = temp->Next;  //Идем к адресу удаляемого элемента
  157.  
  158.               temp2 = temp;                                 //Временно запоминаем адрес удаляемого элемента
  159.               temp2->Prev->Next =   temp->Next;             //Записываем данные, что следующий за перед сейчас удаляемым элементом - это следующий от удаляемого
  160.               temp2->Next->Prev = temp->Prev;               //а предыдущий для следующего - это предыдущий для удаляемого
  161.                  delete temp;                               //теперь смело можно освободить память, удалив адрес на начало удаляемого элемента
  162.           count_--;                                         //Обязательно уменьшаем число элементов в списке.
  163.     }
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173. int main ()
  174. {
  175.      string Surname;
  176.     string Name;
  177.     int Height;
  178.     int Age;  
  179.    
  180.     int t;
  181.  List lst; //Объявляем переменную, тип которой есть список
  182.   do //мен
  183.     {
  184.          lst.Show();
  185.         system("cls");
  186.      
  187.         cout << "\n\n1. add element\n2. del element\n3. Clear\n4. Return address\n0. exit\n>> ";
  188.         cin >> t;
  189.  
  190.         switch (t){
  191.         case 1:
  192.      cout<<"\nVVedite Name: ";
  193.                
  194.       cin>>Name;
  195.         cout<<"\nVVedite Surname: ";
  196.       cin>>Surname;
  197.         cout<<"\nVVedite Height: ";
  198.       cin>>Height;
  199.          cout<<"\nVVedite Age: ";
  200.       cin>>Age;
  201.       cout<<"\n Name     Surname  Height Age"<<endl;
  202.  lst.Add(Name, Surname, Height, Age); //Добавляем в список элементы
  203. cout << endl;
  204. break;
  205.         case 2:
  206.         int w;
  207.         cout <<"enter element: ";
  208.         cin >> w;
  209.        int len;
  210.        len=lst.GetLen();
  211.         if(w > len || w < 1)
  212.                     cout << "Error! Repeat again." << endl;
  213.                 else
  214. lst.Del(w);
  215.         break;
  216.         case 3:
  217.         lst.Clear();
  218.         break;
  219.         case 4:
  220.         int a;
  221.         cin >> a;
  222.         cout<<lst.Get(a);
  223.         cout<<endl;
  224.  }
  225.     } while (t != 0);
  226.     return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement