Advertisement
Garey

Danny_SAA_week9

Mar 26th, 2018
551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.84 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct elem {
  6.     int key;
  7.     elem *next;
  8. }*start = nullptr;
  9.  
  10. void list() {
  11.     if(start) {
  12.         elem *pointer = start;
  13.  
  14.         while(pointer) {
  15.             cout << pointer->key << "\t";
  16.             pointer = pointer->next;
  17.         }
  18.     } else {
  19.         cout << "\nEmpty";
  20.     }
  21. }
  22.  
  23. void add_b(int n) {
  24.     elem *pointer = start;
  25.     start = new elem;
  26.     start->key = n;
  27.     start->next = pointer;
  28. }
  29.  
  30. void add_e(int n) {
  31.     elem *pointer = new elem;
  32.  
  33.     pointer->key = n;
  34.     pointer->next = nullptr;
  35.  
  36.     if(start) {
  37.         elem *helper = start;
  38.        
  39.         while(helper->next != nullptr)
  40.             helper = helper->next;
  41.  
  42.         helper->next = pointer;
  43.     } else
  44.         start = pointer;
  45. }
  46.  
  47. void add_bk(int n, int k) {
  48.     elem *pointer = start; // ukazatelqt pointer sochi kum nachaloto na spisuka
  49.  
  50.     while(pointer->key != k && pointer->next) // vurti, dokato sreshtne k ili ima sledvasht element, ako nqma, shte spre da vurti cikula
  51.         pointer = pointer->next;
  52.    
  53.     if(pointer->key == k) { // ako kliuchovata stoinost na ukazatelq e ravna na k
  54.         elem *helper = new elem; // suzdavame pomoshten ukazatel
  55.  
  56.         helper->next = pointer->next; // sledvashtiqt element na pomoshtniqt ukazatel e sledvashtiqt element na pointer ukazatelq
  57.         pointer->next = helper; // sledvashtiqt element na ukazatelq pointer e raven na tekushtiqt ukazatel helper
  58.  
  59.         // obrushtat se dvete kliuchovi stoinosti, s cel da se dobavi predi tozi element
  60.         helper->key = k;
  61.         pointer->key = n;
  62.     } else
  63.         cout << "K ne e nameren";
  64. }
  65.  
  66. void add_ak(int n, int k) {
  67.     elem *pointer = start; // ukazatelqt pointer sochi kum nachaloto na spisuka
  68.  
  69.     while(pointer->key != k && pointer->next) // vurti, dokato sreshtne k ili ima sledvasht element, ako nqma, shte spre da vurti cikula
  70.         pointer = pointer->next; // ukazatelqt pointer se premestva s edin element napred
  71.    
  72.     if(pointer->key == k) {
  73.         elem *helper = new elem;
  74.  
  75.         helper->next = pointer->next;
  76.         pointer->next = helper;
  77.         // obrushtat se dvete kliuchovi stoinosti, s cel da se dobavi sled tozi element
  78.         helper->key = n;
  79.         pointer->key = k;
  80.     } else
  81.         cout << "K ne e nameren";
  82. }
  83.  
  84. void add_sorted(int n) {
  85.     if(start == nullptr || start->key > n) { // ako e purvi element ili ukazatelqt za nachalo ima po-golqma kliuchova stoinost ot n
  86.         add_b(n); // dobavi v nachaloto
  87.     } else {
  88.         elem *pointer = start; // sochi kum nachaloto na spisuka
  89.  
  90.         while(pointer->key <= n && pointer->next) // dokato ukazatelqt ima kliuchova stoinost po-malka ili ravna na n i ima sledvasht element
  91.             pointer = pointer->next; // premestva se napred kum sledvashtiqt element
  92.  
  93.         if(pointer->key >= n) // ako ukazatelqt ima kliuchova stoinost po-golqma ili rawna na n
  94.             add_bk(n, pointer->key); // dobavi sled tazi kliuchova stoinost v spisuka
  95.         else // v protiven sluchai
  96.             add_e(n); // dobavi nakraq
  97.     }
  98. }
  99.  
  100. int del_k(int k) {
  101.     if(start) {
  102.         elem *pointer = start;
  103.         elem *helper = pointer;
  104.  
  105.         while(pointer->key != k && pointer->next) {// dokato e razlichno ot k i ima sledvasht element
  106.             helper = pointer; // predi da premine kum sledvashtiqt element, zapazva tekushtiqt v nov ukazatel
  107.             pointer = pointer->next; // premestva se napred kum sledvashtiqt element
  108.         }
  109.  
  110.         if(pointer->key == k) {
  111.  
  112.             if(start->key == k) // ako purviqt element e raven na k
  113.                 start = start->next; // purviqt element se premestva s edin element napred
  114.             else
  115.                 helper->next = pointer->next; // preskacha elementa
  116.            
  117.             delete pointer; // iztriva go
  118.             return 1;
  119.         } else {
  120.             cout << "Nqmam k, nqa kvo da triq";
  121.  
  122.             return 0;
  123.         }
  124.     } else
  125.         cout << "Prazen spisuk";
  126.  
  127.     return 0;
  128. }
  129.  
  130. int main() {
  131.  
  132.     int k;
  133.  
  134.     do {
  135.         cout << "\nDigit: ";
  136.         cin >> k;
  137.  
  138.         if(k) {
  139.             add_sorted(k);
  140.             list();
  141.         }
  142.     } while(k != 0);
  143.  
  144.  
  145.     cout << "Vuvedi stoinost, koqto iskash da iztriesh: ";
  146.     cin >> k;
  147.  
  148.     del_k(k); // iztriva elementa sus stoinost k
  149.     list(); // izvejda spisuka
  150.  
  151.     return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement