Advertisement
Guest User

4.Data.structures

a guest
Apr 25th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.83 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include <iostream>
  5. #include <conio.h>
  6. using namespace std;
  7.  
  8. enum Sex
  9. {
  10.     Female,
  11.     Male
  12. };
  13.  
  14. struct Person {
  15.     string Name;
  16.     string Surname;
  17.     Sex Sex;
  18.     unsigned int Age;
  19. };
  20.  
  21. Person ReadPerson() {
  22.     Person person;
  23.     cout << "\nName:\n";
  24.     cin >> person.Name;
  25.     cout << "Surname:\n";
  26.     cin >> person.Surname;
  27.     while (1)
  28.     {
  29.         cout << "Enter Sex(M or F)" << endl;
  30.         char sex;
  31.         sex = _getch();
  32.         if ((sex == 'M') || (sex == 'm'))
  33.         {
  34.             person.Sex = Male;
  35.             cout << "Male\n";
  36.             break;
  37.         }
  38.         else
  39.         {
  40.             if ((sex == 'F') || (sex == 'f'))
  41.             {
  42.                 person.Sex = Female;
  43.                 cout << "Female\n";
  44.                 break;
  45.             }
  46.         }
  47.         {
  48.             cout << "Incorrect" << endl;
  49.         }
  50.     };
  51.     cout << "Age:\n";
  52.     cin >> person.Age;
  53.     return person;
  54. }
  55.  
  56. struct Node
  57. {
  58.     Person Person;
  59.     Node* NextItem;
  60.     Node* PrevItem;
  61. };
  62.  
  63. struct List
  64. {
  65.     Node* Head = NULL;
  66.     Node* Tail = NULL;
  67. };
  68.  
  69. bool CheckList(List List)
  70. {
  71.     return List.Head;
  72. };
  73.  
  74. void Add(List &List)
  75. {
  76.     Node *temp = new Node;
  77.     temp->Person = ReadPerson();
  78.     temp->NextItem = NULL;
  79.     if (CheckList(List) == NULL)
  80.     {
  81.         List.Head = temp;
  82.         temp->PrevItem = NULL;
  83.         cout << "Created head\n";
  84.     }
  85.     else
  86.     {
  87.         List.Tail->NextItem = temp;
  88.         temp->PrevItem = List.Tail;
  89.         cout << "Added tail\n";
  90.     }
  91.     List.Tail = temp;
  92.     cout << "Person added\n";
  93. }
  94.  
  95. void PrintPerson(Person person)
  96. {
  97.     cout << "\nName: " << person.Name << "\nSurname: " << person.Surname;
  98.     switch (person.Sex)
  99.     {
  100.     case(Male) : cout << "\nSex: Male" << endl; break;
  101.     case(Female) : cout << "\nSex: Female" << endl; break;
  102.     }
  103.     cout << "Age: " << person.Age << "\n\n";
  104. }
  105.  
  106. void Show(List &List)
  107. {
  108.     Node* CurrentItem = List.Head;
  109.     if (CheckList(List) == NULL)
  110.     {
  111.         cout << "\nList is empty!\n\n";
  112.     }
  113.     else
  114.     {
  115.         while (CurrentItem != NULL)
  116.         {
  117.             PrintPerson(CurrentItem->Person);
  118.             CurrentItem = CurrentItem->NextItem;
  119.         }
  120.     }
  121. }
  122.  
  123. int GetLen(List &List)
  124. {
  125.     Node *temp = List.Head;
  126.     int i = 0;
  127.     while (temp)
  128.     {
  129.         i++;
  130.         temp = temp->NextItem;
  131.     }
  132.     return i;
  133. }
  134.  
  135. Node* Get(int index, List &List)
  136. {
  137.     int count = GetLen(List);
  138.     if (index > count)
  139.     {
  140.         cout << "\nNo element\n\n";
  141.         return NULL;
  142.     };
  143.     /////
  144.     int i = index;
  145.     if (i > -1)
  146.     {
  147.         Node* CurrentItem = List.Head;
  148.         while ((i != 0) && (CurrentItem != NULL))
  149.         {
  150.             i--;
  151.             CurrentItem = CurrentItem->NextItem;
  152.         }
  153.         if ((i == 0) && (CurrentItem != NULL))
  154.             return CurrentItem;
  155.     }
  156.     return NULL;
  157. }
  158.  
  159. void Remove(int index, List &List)
  160. {
  161.     int count = GetLen(List);
  162.     int i = index;
  163.     if (index > count)
  164.     {
  165.         cout << "\nNo element\n\n";
  166.     }
  167.     else if (i > -1)
  168.     {
  169.         Node* CurrentItem = List.Head;
  170.         if (i == 0)
  171.         {
  172.             List.Head = List.Head->NextItem;
  173.             List.Head->PrevItem = NULL;
  174.             delete CurrentItem;
  175.         }
  176.         else
  177.         {
  178.             while ((i != 0) && (CurrentItem != NULL))
  179.             {
  180.                 i--;
  181.                 CurrentItem = CurrentItem->NextItem;
  182.             }
  183.             if ((i == 0) && (CurrentItem->NextItem != NULL))
  184.             {
  185.                 CurrentItem->PrevItem->NextItem = CurrentItem->NextItem;
  186.                 CurrentItem->NextItem->PrevItem = CurrentItem->PrevItem;
  187.                 delete CurrentItem;
  188.             }
  189.             if ((i == 0) && (CurrentItem->NextItem == NULL) && (CurrentItem != NULL))
  190.             {
  191.                 List.Tail = List.Tail->PrevItem;
  192.                 List.Tail->NextItem = NULL;
  193.                 delete CurrentItem;
  194.             }
  195.         }
  196.     }
  197. }
  198.  
  199. void Insert(int index, List &List)
  200. {
  201.    
  202.     int count = GetLen(List);
  203.     int i = index;
  204.     if (index > count)
  205.     {
  206.         cout << "\nNo element\n\n";
  207.     }
  208.     else if (i > -1)
  209.     {
  210.         if (CheckList(List))
  211.         {
  212.             Node* temp = new Node;
  213.             if (i == 0)
  214.             {
  215.                 temp->Person = ReadPerson();
  216.                 List.Head->PrevItem = temp;
  217.                 temp->NextItem = List.Head;
  218.                 List.Head = temp;
  219.             }
  220.             else
  221.             {
  222.                 Node* CurrentItem = List.Head;
  223.                 while ((i != 0) && (temp != NULL))
  224.                 {
  225.                     i--;
  226.                     CurrentItem = CurrentItem->NextItem;
  227.                 }
  228.                 if ((i == 0) && (CurrentItem->NextItem != NULL))
  229.                 {
  230.                     temp->Person = ReadPerson();
  231.                     temp->PrevItem = CurrentItem;
  232.                     temp->NextItem = CurrentItem->NextItem;
  233.                     CurrentItem->PrevItem->NextItem = temp;
  234.                     CurrentItem->NextItem->PrevItem = temp;
  235.                 }
  236.                 if ((i == 0) && (CurrentItem->NextItem == NULL) && (CurrentItem != NULL))
  237.                 {
  238.                     temp->Person = ReadPerson();
  239.                     List.Tail->NextItem = temp;
  240.                     temp->PrevItem = List.Tail;
  241.                     List.Tail = temp;
  242.                 }
  243.                 else
  244.                     cout << "Not possible.\n";
  245.             }
  246.         }
  247.         else
  248.             Add(List);
  249.     }
  250. }
  251.  
  252. void Clear(List List)
  253. {
  254.     while (List.Head != NULL)
  255.     {
  256.         cout << "Clearing\n";
  257.         Node* CurrentItem = List.Head;
  258.         if (List.Head->NextItem != NULL)
  259.         {
  260.             List.Head->NextItem->PrevItem = NULL;
  261.             List.Head->NextItem = List.Head;
  262.         }
  263.         else
  264.             List.Head = NULL;
  265.         delete CurrentItem;
  266.     }
  267.     cout << "Cleared\n";
  268.  
  269. }
  270.  
  271. void MainMenu()
  272. {
  273.     cout << "\t--------------------------------------\n"
  274.         << "\t------List of Person : Main Menu------\n"
  275.         << "\t1. Add Person\n\t2. Insert Person\n\t3. Get Person By Index\n"
  276.         << "\t4. Remove Person By Index\n\t5. Show All Persons\n"
  277.         << "\t6. Clear List\n\n\tChoose action(1 - 6):";
  278. }
  279.  
  280. int main()
  281. {
  282.     int n = 1;
  283.     int i;
  284.     char buffer[256];
  285.     List list;
  286.  
  287.     while (n != 6)
  288.     {
  289.         MainMenu();
  290.         cin >> buffer;
  291.         n = atoi(buffer);
  292.         switch (n)
  293.         {
  294.         case 1:
  295.             Add(list);
  296.             break;
  297.         case 2:
  298.             cout << "Enter the index: ";
  299.             cin >> i;
  300.             Insert(i, list);
  301.             break;
  302.         case 3:
  303.             cout << "Enter the index: ";
  304.             cin >> i;
  305.             if (Get(i, list) != NULL)
  306.                 PrintPerson((Get(i, list))->Person);
  307.             break;
  308.         case 4:
  309.             cout << "Enter the index: ";
  310.             cin >> i;
  311.             if (Get(i, list) != NULL)
  312.                 Remove(i, list);
  313.             else
  314.                 cout << "\nIncorrect input\n";
  315.             break;
  316.         case 5:
  317.             cout << "List of persons currently in list:\n\n";
  318.             Show(list);
  319.             break;
  320.         case 6:
  321.             Clear(list);
  322.             break;
  323.         default:
  324.             cout << "Incorrect number! Please try again\n";
  325.         }
  326.     }
  327.     system("pause");
  328.     return 0;
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement