Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Создание 2х связного списка
- //добавление элементов
- // удаление порядкового элемннта списка
- #include "stdafx.h"
- #include <cstdlib>
- #include <iostream>
- using namespace std;
- class MyList{ //Список MyList
- int x, count_;
- MyList *Head, *Tail, *Next, *Prev;
- public:
- MyList() :Head(NULL), Tail(NULL), count_(0){}; //Инициализация с помощью конструктора по умолчанию
- void Add(int);
- void Show();
- void Del(int); //Функция принимает целочисленный параметр, обозначающий номер удаляемого элемента
- ~MyList();
- };
- /*ДОБАВЛЕНИЕ ЭЛЕМЕНТА В СПИСОК*/
- void MyList::Add(int x){
- MyList *temp = new MyList;
- temp->x = x;
- temp->Next = NULL;
- count_++;
- if (!Head){
- temp->Prev = NULL;
- Head = temp;
- Tail = Head;
- }
- else {
- temp->Prev = Tail; //Указываем, что предыдущим элементом списка относительно добавленного, будет последний элемент существующего списка
- Tail->Next = temp; //Следующий за последним существующим это непосредственно сейчас добавляемый элемент списка
- Tail = temp; //После того как указали что есть настоящий и что предыдущий, объявляем, что последний существующий это только что добавленный элемент
- }
- }
- /*ПОКАЗЫВАЕТ СПИСОК НА ЭКРАНЕ*/
- void MyList::Show(){
- MyList *t = Head;
- while (t)
- {
- cout << t->x << " ";
- t = t->Next;
- }
- cout << "\n\n";
- }
- /*ФУНКЦИЯ УДАЛЕНИЯ КОНКРЕТНОГО ЭЛЕМЕНТА ДВУСВЯЗНОГО СПИСКА*/
- void MyList::Del(int x){
- //Если удаляем первый элемент, то могут быть такие варианты
- //В списке есть только первый, в списке есть несколько элементов
- //Поэтому разбиваем логику выполнения
- if (x == 1 && Head->Next)
- { //Если удаляем первый, но есть и другие, то
- MyList *temp = Head; //Указываем, что нам нужно начало списка
- Head = Head->Next; //Сдвигаем начало на следующий за началом элемент
- Head->Prev = NULL; //Делаем так, чтоб предыдущий началу элемент был пустым
- delete temp; //Удаляем удаляемое начало
- count_--; //Обязательно уменьшаем счетчик
- return; //И выходим из функции
- }
- else if ((x == 1) && (Head == Tail)){ //Если удаляем первый, но в списке только 1 элемент
- Head->Next = NULL; //обнуляем все что нужно
- Head = NULL;
- delete Head; //Удаляем указатель на начало
- count_ = 0; //Обязательно обозначаем, что в списке ноль элементов
- return; //и выходим из функции
- }
- //Также может быть, что удаляемый элемент является последним элементом списка
- if (x == count_){
- MyList *temp = Tail; //Указываем, что нам нужен хвост
- Tail = Tail->Prev; //Отодвигаем хвост немного назад
- Tail->Next = NULL; //Обозначаем, что впереди за хвостом пусто
- delete temp; //Очищаем память от бывшего хвоста
- count_--; //Обязательно уменьшаем счетчик элементов
- return; //И выходим из функции
- }
- //Если же удаляемый элемент лежит где-то в середине списка, то тогда его можно удалить
- MyList *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_--; //Обязательно уменьшаем число элементов в списке.
- }
- /*ДЕСТРУКТОР ДЛЯ КОРРЕКТНОГО ВЫСВОБОЖДЕНИЯ ПАМЯТИ*/
- MyList::~MyList(){
- // cout<<"\nDELETES\n";
- while (Head){
- // cout<<"Del is: "<<Head->x<<" ";
- Tail = Head->Next;
- delete Head;
- Head = Tail;
- }
- }
- int main(){
- MyList List1;
- List1.Add(20);//1 элемент
- List1.Add(10);//2 элемент
- List1.Add(30);//3 элемент
- List1.Add(50);//4 элемент
- List1.Add(40);//5 элемент
- List1.Show();//Отображаем список
- //List1.Del(3);//даляем третий элемент
- //List1.Show();
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement