Advertisement
scherbakovss

2х связный список С++

Jun 20th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.74 KB | None | 0 0
  1. //Создание 2х связного списка
  2. //добавление элементов
  3. // удаление порядкового элемннта списка
  4.  
  5. #include "stdafx.h"
  6. #include <cstdlib>
  7. #include <iostream>
  8. using namespace std;
  9.  
  10. class MyList{ //Список MyList
  11. int x, count_;
  12. MyList *Head, *Tail, *Next, *Prev;
  13. public:
  14. MyList() :Head(NULL), Tail(NULL), count_(0){}; //Инициализация с помощью конструктора по умолчанию
  15. void Add(int);
  16. void Show();
  17. void Del(int); //Функция принимает целочисленный параметр, обозначающий номер удаляемого элемента
  18. ~MyList();
  19. };
  20.  
  21. /*ДОБАВЛЕНИЕ ЭЛЕМЕНТА В СПИСОК*/
  22. void MyList::Add(int x){
  23. MyList *temp = new MyList;
  24. temp->x = x;
  25. temp->Next = NULL;
  26. count_++;
  27. if (!Head){
  28. temp->Prev = NULL;
  29. Head = temp;
  30. Tail = Head;
  31. }
  32. else {
  33. temp->Prev = Tail; //Указываем, что предыдущим элементом списка относительно добавленного, будет последний элемент существующего списка
  34. Tail->Next = temp; //Следующий за последним существующим это непосредственно сейчас добавляемый элемент списка
  35. Tail = temp; //После того как указали что есть настоящий и что предыдущий, объявляем, что последний существующий это только что добавленный элемент
  36. }
  37. }
  38.  
  39. /*ПОКАЗЫВАЕТ СПИСОК НА ЭКРАНЕ*/
  40. void MyList::Show(){
  41. MyList *t = Head;
  42. while (t)
  43. {
  44. cout << t->x << " ";
  45. t = t->Next;
  46. }
  47. cout << "\n\n";
  48. }
  49.  
  50.  
  51. /*ФУНКЦИЯ УДАЛЕНИЯ КОНКРЕТНОГО ЭЛЕМЕНТА ДВУСВЯЗНОГО СПИСКА*/
  52. void MyList::Del(int x){
  53. //Если удаляем первый элемент, то могут быть такие варианты
  54. //В списке есть только первый, в списке есть несколько элементов
  55. //Поэтому разбиваем логику выполнения
  56. if (x == 1 && Head->Next)
  57.  
  58. { //Если удаляем первый, но есть и другие, то
  59. MyList *temp = Head; //Указываем, что нам нужно начало списка
  60. Head = Head->Next; //Сдвигаем начало на следующий за началом элемент
  61. Head->Prev = NULL; //Делаем так, чтоб предыдущий началу элемент был пустым
  62. delete temp; //Удаляем удаляемое начало
  63. count_--; //Обязательно уменьшаем счетчик
  64. return; //И выходим из функции
  65. }
  66. else if ((x == 1) && (Head == Tail)){ //Если удаляем первый, но в списке только 1 элемент
  67.  
  68. Head->Next = NULL; //обнуляем все что нужно
  69. Head = NULL;
  70. delete Head; //Удаляем указатель на начало
  71. count_ = 0; //Обязательно обозначаем, что в списке ноль элементов
  72. return; //и выходим из функции
  73. }
  74.  
  75. //Также может быть, что удаляемый элемент является последним элементом списка
  76. if (x == count_){
  77. MyList *temp = Tail; //Указываем, что нам нужен хвост
  78. Tail = Tail->Prev; //Отодвигаем хвост немного назад
  79. Tail->Next = NULL; //Обозначаем, что впереди за хвостом пусто
  80. delete temp; //Очищаем память от бывшего хвоста
  81. count_--; //Обязательно уменьшаем счетчик элементов
  82. return; //И выходим из функции
  83. }
  84.  
  85. //Если же удаляемый элемент лежит где-то в середине списка, то тогда его можно удалить
  86.  
  87. MyList *temp = Head, *temp2; //temp-Удаляемый элемент, temp2 нужен, чтобы не потерять данные
  88.  
  89. //cout<<count_<<"\n";
  90. for (int i = 0; i<x - 1; i++) temp = temp->Next; //Идем к адресу удаляемого элемента
  91.  
  92. temp2 = temp; //Временно запоминаем адрес удаляемого элемента
  93. temp2->Prev->Next = temp->Next; //Записываем данные, что следующий за перед сейчас удаляемым элементом - это следующий от удаляемого
  94. temp2->Next->Prev = temp->Prev; //а предыдущий для следующего - это предыдущий для удаляемого
  95. delete temp; //теперь смело можно освободить память, удалив адрес на начало удаляемого элемента
  96. count_--; //Обязательно уменьшаем число элементов в списке.
  97. }
  98.  
  99.  
  100. /*ДЕСТРУКТОР ДЛЯ КОРРЕКТНОГО ВЫСВОБОЖДЕНИЯ ПАМЯТИ*/
  101. MyList::~MyList(){
  102. // cout<<"\nDELETES\n";
  103. while (Head){
  104. // cout<<"Del is: "<<Head->x<<" ";
  105. Tail = Head->Next;
  106. delete Head;
  107. Head = Tail;
  108.  
  109. }
  110. }
  111.  
  112.  
  113. int main(){
  114. MyList List1;
  115. List1.Add(20);//1 элемент
  116. List1.Add(10);//2 элемент
  117. List1.Add(30);//3 элемент
  118. List1.Add(50);//4 элемент
  119. List1.Add(40);//5 элемент
  120. List1.Show();//Отображаем список
  121. //List1.Del(3);//даляем третий элемент
  122. //List1.Show();
  123. system("PAUSE");
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement