Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string>
- #include <iostream>
- #include <conio.h>
- using namespace std;
- enum Sex
- {
- Female,
- Male
- };
- struct Person {
- string Name;
- string Surname;
- Sex Sex;
- unsigned int Age;
- };
- Person ReadPerson() {
- Person person;
- cout << "\nName:\n";
- cin >> person.Name;
- cout << "Surname:\n";
- cin >> person.Surname;
- while (1)
- {
- cout << "Enter Sex(M or F)" << endl;
- char sex;
- sex = _getch();
- if ((sex == 'M') || (sex == 'm'))
- {
- person.Sex = Male;
- cout << "Male\n";
- break;
- }
- else
- {
- if ((sex == 'F') || (sex == 'f'))
- {
- person.Sex = Female;
- cout << "Female\n";
- break;
- }
- }
- {
- cout << "Incorrect" << endl;
- }
- };
- cout << "Age:\n";
- cin >> person.Age;
- return person;
- }
- struct Node
- {
- Person Person;
- Node* NextItem;
- Node* PrevItem;
- };
- struct List
- {
- Node* Head = NULL;
- Node* Tail = NULL;
- };
- bool CheckList(List List)
- {
- return List.Head;
- };
- void Add(List &List)
- {
- Node *temp = new Node;
- temp->Person = ReadPerson();
- temp->NextItem = NULL;
- if (CheckList(List) == NULL)
- {
- List.Head = temp;
- temp->PrevItem = NULL;
- cout << "Created head\n";
- }
- else
- {
- List.Tail->NextItem = temp;
- temp->PrevItem = List.Tail;
- cout << "Added tail\n";
- }
- List.Tail = temp;
- cout << "Person added\n";
- }
- void PrintPerson(Person person)
- {
- cout << "\nName: " << person.Name << "\nSurname: " << person.Surname;
- switch (person.Sex)
- {
- case(Male) : cout << "\nSex: Male" << endl; break;
- case(Female) : cout << "\nSex: Female" << endl; break;
- }
- cout << "Age: " << person.Age << "\n\n";
- }
- void Show(List &List)
- {
- Node* CurrentItem = List.Head;
- if (CheckList(List) == NULL)
- {
- cout << "\nList is empty!\n\n";
- }
- else
- {
- while (CurrentItem != NULL)
- {
- PrintPerson(CurrentItem->Person);
- CurrentItem = CurrentItem->NextItem;
- }
- }
- }
- int GetLen(List &List)
- {
- Node *temp = List.Head;
- int i = 0;
- while (temp)
- {
- i++;
- temp = temp->NextItem;
- }
- return i;
- }
- Node* Get(int index, List &List)
- {
- int count = GetLen(List);
- if (index > count)
- {
- cout << "\nNo element\n\n";
- return NULL;
- };
- /////
- int i = index;
- if (i > -1)
- {
- Node* CurrentItem = List.Head;
- while ((i != 0) && (CurrentItem != NULL))
- {
- i--;
- CurrentItem = CurrentItem->NextItem;
- }
- if ((i == 0) && (CurrentItem != NULL))
- return CurrentItem;
- }
- return NULL;
- }
- void Remove(int index, List &List)
- {
- int count = GetLen(List);
- int i = index;
- if (index > count)
- {
- cout << "\nNo element\n\n";
- }
- else if (i > -1)
- {
- Node* CurrentItem = List.Head;
- if (i == 0)
- {
- List.Head = List.Head->NextItem;
- List.Head->PrevItem = NULL;
- delete CurrentItem;
- }
- else
- {
- while ((i != 0) && (CurrentItem != NULL))
- {
- i--;
- CurrentItem = CurrentItem->NextItem;
- }
- if ((i == 0) && (CurrentItem->NextItem != NULL))
- {
- CurrentItem->PrevItem->NextItem = CurrentItem->NextItem;
- CurrentItem->NextItem->PrevItem = CurrentItem->PrevItem;
- delete CurrentItem;
- }
- if ((i == 0) && (CurrentItem->NextItem == NULL) && (CurrentItem != NULL))
- {
- List.Tail = List.Tail->PrevItem;
- List.Tail->NextItem = NULL;
- delete CurrentItem;
- }
- }
- }
- }
- void Insert(int index, List &List)
- {
- int count = GetLen(List);
- int i = index;
- if (index > count)
- {
- cout << "\nNo element\n\n";
- }
- else if (i > -1)
- {
- if (CheckList(List))
- {
- Node* temp = new Node;
- if (i == 0)
- {
- temp->Person = ReadPerson();
- List.Head->PrevItem = temp;
- temp->NextItem = List.Head;
- List.Head = temp;
- }
- else
- {
- Node* CurrentItem = List.Head;
- while ((i != 0) && (temp != NULL))
- {
- i--;
- CurrentItem = CurrentItem->NextItem;
- }
- if ((i == 0) && (CurrentItem->NextItem != NULL))
- {
- temp->Person = ReadPerson();
- temp->PrevItem = CurrentItem;
- temp->NextItem = CurrentItem->NextItem;
- CurrentItem->PrevItem->NextItem = temp;
- CurrentItem->NextItem->PrevItem = temp;
- }
- if ((i == 0) && (CurrentItem->NextItem == NULL) && (CurrentItem != NULL))
- {
- temp->Person = ReadPerson();
- List.Tail->NextItem = temp;
- temp->PrevItem = List.Tail;
- List.Tail = temp;
- }
- else
- cout << "Not possible.\n";
- }
- }
- else
- Add(List);
- }
- }
- void Clear(List List)
- {
- while (List.Head != NULL)
- {
- cout << "Clearing\n";
- Node* CurrentItem = List.Head;
- if (List.Head->NextItem != NULL)
- {
- List.Head->NextItem->PrevItem = NULL;
- List.Head->NextItem = List.Head;
- }
- else
- List.Head = NULL;
- delete CurrentItem;
- }
- cout << "Cleared\n";
- }
- void MainMenu()
- {
- cout << "\t--------------------------------------\n"
- << "\t------List of Person : Main Menu------\n"
- << "\t1. Add Person\n\t2. Insert Person\n\t3. Get Person By Index\n"
- << "\t4. Remove Person By Index\n\t5. Show All Persons\n"
- << "\t6. Clear List\n\n\tChoose action(1 - 6):";
- }
- int main()
- {
- int n = 1;
- int i;
- char buffer[256];
- List list;
- while (n != 6)
- {
- MainMenu();
- cin >> buffer;
- n = atoi(buffer);
- switch (n)
- {
- case 1:
- Add(list);
- break;
- case 2:
- cout << "Enter the index: ";
- cin >> i;
- Insert(i, list);
- break;
- case 3:
- cout << "Enter the index: ";
- cin >> i;
- if (Get(i, list) != NULL)
- PrintPerson((Get(i, list))->Person);
- break;
- case 4:
- cout << "Enter the index: ";
- cin >> i;
- if (Get(i, list) != NULL)
- Remove(i, list);
- else
- cout << "\nIncorrect input\n";
- break;
- case 5:
- cout << "List of persons currently in list:\n\n";
- Show(list);
- break;
- case 6:
- Clear(list);
- break;
- default:
- cout << "Incorrect number! Please try again\n";
- }
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement