Advertisement
LukacikPavel

zoznam

Nov 18th, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. using namespace std;
  4.  
  5. /** struktura pre uzol zoznamu */
  6. struct node {
  7.     int data;     // data v uzle
  8.     int size;     // velkost opla smernikov v uzle
  9.     node** next;  // pole smernikov, pricom next[0] je smernik
  10.     // na dalsí uzol v zozname; dalsie hodnoty
  11.     // v poli ukazuju na ine uzly alebo su NULL
  12. };
  13.  
  14.  
  15. /* Nacitanie zoznamu zo vstupu, pricom kazde cislo sa prida na koniec
  16.  * zoznamu. Zoznam je ukonceny cislom -1.  Navratova hodnota je smernik
  17.  * na prvy uzol alebo NULL ak je zoznam prazdny. */
  18. node* read() {
  19.     // nacitame data
  20.     int x;
  21.     cin >> x;
  22.     // vybavime prazdny zoznam
  23.     if (x < 0) return NULL;
  24.     // nacitame velkost pola smernikov
  25.     int size;
  26.     cin >> size;
  27.     assert(size >= 1);
  28.  
  29.     // alokujeme prvy uzol, ulozime data
  30.     node *first = new node;
  31.     first->data = x;
  32.     first->size = size;
  33.     first->next = new node *[size];
  34.  
  35.     // rekurzivne nacitame zvysok zoznamu
  36.     // a smernik na druhy prvok ulozime do next[0]
  37.     first->next[0] = read();
  38.  
  39.     // inicializacia zvysnych smernikov v poli
  40.     // pricom next[i[ ukazuje na prvy dalsi prvok v zozname,
  41.     // ktory tiez ma index i vo svojom poli
  42.     for (int i = 1; i < size; i++) {
  43.         first->next[i] = first->next[i - 1];
  44.         while (first->next[i] != NULL
  45.                 && first->next[i]->size <= i) {
  46.             assert(first->next[i]->size == i);
  47.             first->next[i] = first->next[i]->next[i - 1];
  48.         }
  49.     }
  50.  
  51.     return first;
  52. }
  53.  
  54. /* uvolnenie pamate pre zoznam */
  55. void destroy(node *first) {
  56.     while (first != NULL) {
  57.         node* p = first;
  58.         first = first->next[0];
  59.         // nezabudneme uvolnit pole smernikov
  60.         delete[] p->next;
  61.         // uvolnenie samotneho uzla
  62.         delete p;
  63.     }
  64. }
  65.  
  66. /* Funkcia dostane smernik na prvy uzol spajaneho zoznamu
  67. * a vypise tento zoznam vo formate uvedenom v zadani */
  68. void vypis(node *first) {
  69.     if(first == NULL){
  70.         return;
  71.     }
  72.     cout << "data " <<  first->data << " next";
  73.     for(int i = 0; i < first->size; i++){
  74.         cout << " ";
  75.         if (first->next[i] == NULL){
  76.             cout << "NULL";
  77.         } else {
  78.             cout << first->next[i]->data;
  79.         }
  80.     }
  81.     cout << endl;
  82.    
  83.     vypis(first->next[0]);
  84. }
  85.  
  86.  
  87. int main(void) {
  88.     /* nacitame zoznam */
  89.     node *first = read();
  90.  
  91.     /* vypiseme uzly zoznamu */
  92.     vypis(first);
  93.  
  94.     /* uvolnime pamat */
  95.     destroy(first);
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement