Advertisement
themlgyo

Двунаправленный список (не работает)

Dec 2nd, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct Node{
  5.     int d;
  6.     Node *next;
  7.     Node *prev;
  8. };
  9.  
  10. void add(Node *&begin, int d){
  11.     Node *cur = new Node;
  12.     cur->d = d;
  13.     cur->next = nullptr;
  14.     if (!begin){
  15.         begin = cur;
  16.         cur->prev = nullptr;
  17.     }
  18.     else {
  19.         Node*temp = begin;
  20.         while (temp->next) temp = temp->next;
  21.         temp->next = cur;
  22.         cur->prev = temp;
  23.     }
  24. }
  25.  
  26. Node* find(Node *begin, int key, int d){ // Поиск элемента по ключу
  27.     Node *cur = begin;
  28.     while (cur){
  29.         if (cur->d == d) break;
  30.         cur = cur->next;
  31.     }
  32.     return cur;
  33. }
  34.  
  35. bool insert(Node *begin, int key, int d){ // Вставка элемента после заданного
  36.     Node *pkey = find(begin, key);
  37.     if (!pkey) return false;
  38.     Node *cur = new Node;
  39.     cur->d = d;
  40.     cur->next = pkey->next; // Установка связи нового узла с последующим
  41.     cur->prev = pkey; // Установка связи нового узла с предыдущим
  42.     pkey->next = cur; // Связь предыдущего узла с новым
  43.     if (cur->next != nullptr)(cur->next)->prev = cur;  // Связь последующего узла с новым
  44.     return true;
  45. }
  46.  
  47. void print(Node *begin){ // Вывод списка на экарн
  48.     Node *cur = begin;
  49.     while (cur){
  50.         cout << cur->d << ' ';
  51.         cur = cur->next;
  52.     }
  53. }
  54.  
  55. bool remove(Node *&begin, int key){
  56.     Node *cur = find(begin, key);
  57.     if (!cur) return false;
  58.     if (cur == begin){
  59.         begin = begin->next;
  60.         begin->prev = nullptr;
  61.     }
  62.     else {
  63.         (cur->prev)->next = cur->next;
  64.         if (cur->next != nullptr) (cur->next)->prev = cur->prev;
  65.     }
  66.     delete cur;
  67.     return true;
  68. }
  69.  
  70. int main(){
  71.  
  72.     Node *begin = nullptr;
  73.     for (int i = 1; i < 6; i++) // Вставка элементов 1,2,3,4,5
  74.         add(begin, i);
  75.     if (!insert(begin, 2, 200)) // Вставка 200 после элемента 2
  76.         cout << "Вставка не выполнена" << endl;
  77.     if (!insert(begin, 5, 500)) // Вставка 500 после элемента 5
  78.         cout << "Вставка не выполнена" << endl;
  79.     if (!remove(begin, 5)) // Удаление элемента 5
  80.         cout << "Удаление не выполнено" << endl;
  81.  
  82.     print(begin); // Вывод элементов
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement