Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<math.h>
- #include<conio.h>
- #include <iostream>
- //#include "stdafx.h"
- using namespace std;
- struct mylist//структура-звено списка
- {
- int x;//значение передается в список
- mylist *prev, *next;//указатели на адреса предыдущ и следующего
- };
- class List//создаем тип данных Список
- {
- mylist *Head, *Tail;//указатель на первый и последний элемент списка
- int size;//переменная,отв за размер
- public:
- List() :Head(NULL), Tail(NULL) {};//инициализируем адреса как пустые (положили ноль)
- ~List();//ссылка на деструктор
- void Show();
- void Add(int x);
- void push_front(int);
- int pop_front();
- void push_back(int data);
- int pop_back();
- int Size();
- void split(List &, int choise);
- void merge(List, List, List &);
- void Clear();
- int Resize(int choise);
- };
- List::~List()
- {
- while (Head!=NULL)
- {
- Tail = Head->next;//резервная копия следующего элемента списка
- delete Head;//очистка первого элемента
- Head = Tail;//смена адреса начала на адрес след элемента
- }
- }
- void List::Add(int x)
- {
- mylist *temp = new mylist;//выделение памяти под повый элемент сттуктуры
- temp->next = NULL;//изначально адрес след элемента 0
- temp->x = x;
- size++;
- if (Head != NULL)
- {
- temp->prev = Tail;
- Tail->next = temp;
- Tail = temp;
- }
- else
- {
- temp->prev = NULL;
- Head = Tail = temp;
- }
- }
- void List::Show()//выводим эхлементы с конца
- {
- mylist *temp1 = Head;//на новой белой карточке пишем хвост
- while (temp1 != NULL)
- {
- cout << temp1->x << endl;
- temp1 = temp1->next;
- }
- }
- int List::Size()
- {
- int y;//счетчик карточек
- mylist* temp2 = Head;//наложим наш шаблон на первую карточку
- while (temp2 != NULL)//пока наш шаблон не наткнется на ноль
- {
- ++y;
- temp2 = temp2->next;//передвигаем шаблон
- }
- return y;
- }
- int List::Resize(int choise)//choise кол-во элементов,которое мы хотим выкинуть
- {
- mylist* temp3 = Head;
- for (int i=0; i<choise; i++)//до тех пор пока ... выкидываем
- {
- temp3 = Head->next;//резервная копия следующего элемента списка
- delete Head;//очистка первого элемента
- Head = temp3;//смена адреса начала на адрес след элемента
- }
- }
- //очистить список (скопированна прога конструктор)
- void List::Clear()
- {
- while (Head!=NULL)
- {
- Tail = Head->next;//резервная копия следующего элемента списка
- delete Head;//очистка первого элемента
- Head = Tail;//смена адреса начала на адрес след элемента
- }
- }
- // перед head кладем еще одну карточку
- void List::push_front(int data)// data то ,что кладем в x
- {
- size++;//размер списка увеличили на одну позицию
- mylist* temp = new mylist; //берем новый шаблон
- temp->x = data;
- if (Head != NULL)
- {
- temp->next = Head;
- Head->prev = temp;
- Head = temp;
- }
- else//если наша карточка первая
- {
- temp->prev = NULL;
- temp->next = NULL;
- Head = Tail = temp;
- }
- }
- // Удаляет карточку, находящийся в начале списка и он выдает на экран что он удалил
- int List::pop_front()
- {
- if (Head != NULL)
- {
- int t = Head->x;//берем х из головы и приравниваем к т
- mylist* temp = Head;// скопировали информацию о голове в новую карточку
- Head = temp->next;//переместили голову на одну позицию вперед
- delete[] temp;// удалили бывшую первую карточку
- size--;
- return t;//вывели значение бывшего первого элемента
- }
- }
- // Вставляет объект как нижний элемент дека
- void List::push_back(int data)
- {
- size++;
- mylist* temp = new mylist;
- if (Head != NULL)
- {
- mylist* Tail = new mylist;
- for (mylist*i = Head; i != NULL; i = i->next){
- if (i->next == NULL)
- Tail = i;
- }
- Tail->next = temp;
- temp->prev = Tail;
- Tail = temp;
- }
- else
- {
- temp->prev = NULL;
- temp->next = NULL;
- Head = Tail = temp;
- }
- }
- // Удаляет и возвращает объект, находящийся в конце дека
- int List::pop_back()
- {
- if (Head)
- {
- mylist* Tail = new mylist;
- for (mylist*i = Head; i != NULL; i = i->next){
- if (i->next == NULL)
- Tail = i;
- }
- int t = Tail->x;
- mylist* temp = Tail;
- Tail = temp->prev;
- Tail->next = NULL;
- delete[] temp;
- size--;
- return t;
- }
- }
- //функция кторая объединяет два списка
- void List::merge(List l1, List l2,List& l3)
- {
- mylist *temp1, *temp2;//mylist-тип шаблона,названия шаблонов
- temp1 = l1.Head;//temp 1= голова первого списка
- temp2 = l2.Head;//temp 2= голова второго списка
- int dat;//переменная для хранения инф о карточке
- if (temp1==NULL && temp2 == NULL) cout<<"NULL"<<endl;
- while(temp1!=NULL)//пока шаблоны не утыкаются в пустоту
- {
- dat = temp1->x;
- l3.Add(dat);//в список 3 добавили x из первго шаблона
- temp1 = temp1->next;//прогнали все карточки 1 списка
- }
- while (temp2!=NULL)
- {
- dat = temp2->x;
- l3.Add(dat);
- temp2 = temp2->next;
- }
- }
- //функция разделения на два списка
- void List::split(List& l2, int choice)//choice-сколько элементов будет в одном из списков
- {
- mylist *temp1 = new mylist;//первую пустую карточку наполняем данными из Head
- mylist *temp2 = new mylist;
- if (Head == NULL)
- {
- cout<<"No data for splitting" <<endl;
- return;//выбросит из функции
- }
- int dat;
- for (int i = 0; i < choice; i++)
- {
- dat = Head->x;
- l2.Add(dat);
- Head = Head->next;
- }
- }
- int main()
- {
- //system("CLS");
- List d;
- d.Add(100);
- d.Add(1000);
- d.Add(200);
- d.Add(400);
- List l;
- d.split(l, 1);
- List k;
- List m;
- //k.Add(1);
- //k.Add(2);
- //k.Add(3);
- //k.Add(4);
- /*k.push_back(3);
- k.push_back(4);
- k.push_front(5);
- k.push_front(6);*/
- //m.merge(d, k,m);
- d.Show();
- l.Show();
- k.~List();
- m.~List();
- d.~List();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement