Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <iostream>
- using namespace std;
- struct Node //Структура, являющаяся звеном списка
- {
- string Surname;
- string Name;
- int Height;
- int Age; //Значение x будет передаваться в список
- Node *Next, *Prev; //Указатели на адреса следующего и предыдущего элементов списка
- };
- class List //Создаем тип данных Список
- {
- Node *Head, *Tail; //Указатели на адреса начала списка и его конца
- public:
- List():Head(NULL),Tail(NULL){}; //Инициализируем адреса как пустые
- ~List(); //Прототип деструктора
- int x, count_;
- void Show(); //Прототип функции отображения списка на экране
- void Del(int);
- void Add(string Name, string Surname, int Height, int Age);
- void Insert(Node &node, int index);
- void Clear();
- int GetLen();
- Node* Get(int index);
- };
- List::~List() //Деструктор
- {
- while (Head) //Пока по адресу на начало списка что-то есть
- {
- Tail = Head->Next; //Резервная копия адреса следующего звена списка
- delete Head; //Очистка памяти от первого звена
- Head = Tail; //Смена адреса начала на адрес следующего элемента
- }
- }
- void List::Clear()
- {
- while(Head)
- {
- Tail = Head->Next;
- delete Head;
- Head = Tail;
- }
- }
- int List::GetLen()
- {
- Node *temp = Head;
- int i(0);
- while(temp)
- {
- i++;
- temp = temp->Next;
- }
- return i;
- }
- Node* List::Get(int index)
- {
- Node *temp = Head;
- int i=0;
- while(temp && i<index)
- {
- temp = temp->Next;
- i++;
- }
- return temp;
- }
- void List::Add(string Name, string Surname, int Height, int Age)
- {
- Node *temp = new Node; //Выделение памяти под новый элемент структуры
- temp->Next = NULL; //Указываем, что изначально по следующему адресу пусто
- temp->Name = Name; //Записываем значение в структуру
- temp->Surname = Surname;
- temp->Height = Height;
- temp->Age = Age;
- if (Head != NULL) //Если список не пуст
- {
- temp->Prev = Tail; //Указываем адрес на предыдущий элемент в соотв. поле
- Tail->Next = temp; //Указываем адрес следующего за хвостом элемента
- Tail = temp; //Меняем адрес хвоста
- }
- else //Если список пустой
- {
- temp->Prev = NULL; //Предыдущий элемент указывает в пустоту
- Head = Tail = temp; //Голова=Хвост=тот элемент, что сейчас добавили
- }
- }
- void List::Show()
- {
- //ВЫВОДИМ СПИСОК С КОНЦА
- Node *temp=Tail; //Временный указатель на адрес последнего элемента
- /* while (temp != NULL) //Пока не встретится пустое значение
- {
- cout << temp->Name << " "<< temp->Surname << " "<< temp->Height << " "<< temp->Age << " "; //Выводить значение на экран
- temp = temp->Prev; //Указываем, что нужен адрес предыдущего элемента
- }
- cout << "\n";
- */
- //ВЫВОДИМ СПИСОК С НАЧАЛА
- temp = Head; //Временно указываем на адрес первого элемента
- while (temp != NULL) //Пока не встретим пустое значение
- {
- cout << temp->Name << " "<< temp->Surname << " "<< temp->Height << " "<< temp->Age << " "; //Выводим каждое считанное значение на экран
- temp = temp->Next; //Смена адреса на адрес следующего элемента
- }
- cout << "\n";
- }
- void List::Del(int x){
- //Если удаляем первый элемент, то могут быть такие варианты
- //В списке есть только первый, в списке есть несколько элементов
- //Поэтому разбиваем логику выполнения
- if ((x == 1) and (Head->Next)){ //Если удаляем первый, но есть и другие, то
- Node *temp = Head; //Указываем, что нам нужно начало списка
- Head = Head->Next; //Сдвигаем начало на следующий за началом элемент
- Head->Prev = NULL; //Делаем так, чтоб предыдущий началу элемент был пустым
- delete temp; //Удаляем удаляемое начало
- count_--; //Обязательно уменьшаем счетчик
- return ; //И выходим из функции
- } else if ((x == 1) and (Head == Tail)){ //Если удаляем первый, но в списке только 1 элемент
- Head->Next = NULL; //обнуляем все что нужно
- Head = NULL;
- delete Head; //Удаляем указатель на начало
- count_ = 0; //Обязательно обозначаем, что в списке ноль элементов
- return; //и выходим из функции
- }
- //Также может быть, что удаляемый элемент является последним элементом списка
- if (x==count_){
- Node *temp = Tail; //Указываем, что нам нужен хвост
- Tail = Tail->Prev; //Отодвигаем хвост немного назад
- Tail->Next = NULL; //Обозначаем, что впереди за хвостом пусто
- delete temp; //Очищаем память от бывшего хвоста
- count_--; //Обязательно уменьшаем счетчик элементов
- return; //И выходим из функции
- }
- //Если же удаляемый элемент лежит где-то в середине списка, то тогда его можно удалить
- Node *temp = Head, *temp2; //temp-Удаляемый элемент, temp2 нужен, чтобы не потерять данные
- //cout<<count_<<"\n";
- for (int i=0; i<x-1; i++) temp = temp->Next; //Идем к адресу удаляемого элемента
- temp2 = temp; //Временно запоминаем адрес удаляемого элемента
- temp2->Prev->Next = temp->Next; //Записываем данные, что следующий за перед сейчас удаляемым элементом - это следующий от удаляемого
- temp2->Next->Prev = temp->Prev; //а предыдущий для следующего - это предыдущий для удаляемого
- delete temp; //теперь смело можно освободить память, удалив адрес на начало удаляемого элемента
- count_--; //Обязательно уменьшаем число элементов в списке.
- }
- int main ()
- {
- string Surname;
- string Name;
- int Height;
- int Age;
- int t;
- List lst; //Объявляем переменную, тип которой есть список
- do //мен
- {
- lst.Show();
- system("cls");
- cout << "\n\n1. add element\n2. del element\n3. Clear\n4. Return address\n0. exit\n>> ";
- cin >> t;
- switch (t){
- case 1:
- cout<<"\nVVedite Name: ";
- cin>>Name;
- cout<<"\nVVedite Surname: ";
- cin>>Surname;
- cout<<"\nVVedite Height: ";
- cin>>Height;
- cout<<"\nVVedite Age: ";
- cin>>Age;
- cout<<"\n Name Surname Height Age"<<endl;
- lst.Add(Name, Surname, Height, Age); //Добавляем в список элементы
- cout << endl;
- break;
- case 2:
- int w;
- cout <<"enter element: ";
- cin >> w;
- int len;
- len=lst.GetLen();
- if(w > len || w < 1)
- cout << "Error! Repeat again." << endl;
- else
- lst.Del(w);
- break;
- case 3:
- lst.Clear();
- break;
- case 4:
- int a;
- cin >> a;
- cout<<lst.Get(a);
- cout<<endl;
- }
- } while (t != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement