Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cassert>
- using namespace std;
- /** struktura pre uzol zoznamu */
- struct node {
- int data; // data v uzle
- int size; // velkost opla smernikov v uzle
- node** next; // pole smernikov, pricom next[0] je smernik
- // na dalsí uzol v zozname; dalsie hodnoty
- // v poli ukazuju na ine uzly alebo su NULL
- };
- /* Nacitanie zoznamu zo vstupu, pricom kazde cislo sa prida na koniec
- * zoznamu. Zoznam je ukonceny cislom -1. Navratova hodnota je smernik
- * na prvy uzol alebo NULL ak je zoznam prazdny. */
- node* read() {
- // nacitame data
- int x;
- cin >> x;
- // vybavime prazdny zoznam
- if (x < 0) return NULL;
- // nacitame velkost pola smernikov
- int size;
- cin >> size;
- assert(size >= 1);
- // alokujeme prvy uzol, ulozime data
- node *first = new node;
- first->data = x;
- first->size = size;
- first->next = new node *[size];
- // rekurzivne nacitame zvysok zoznamu
- // a smernik na druhy prvok ulozime do next[0]
- first->next[0] = read();
- // inicializacia zvysnych smernikov v poli
- // pricom next[i[ ukazuje na prvy dalsi prvok v zozname,
- // ktory tiez ma index i vo svojom poli
- for (int i = 1; i < size; i++) {
- first->next[i] = first->next[i - 1];
- while (first->next[i] != NULL
- && first->next[i]->size <= i) {
- assert(first->next[i]->size == i);
- first->next[i] = first->next[i]->next[i - 1];
- }
- }
- return first;
- }
- /* uvolnenie pamate pre zoznam */
- void destroy(node *first) {
- while (first != NULL) {
- node* p = first;
- first = first->next[0];
- // nezabudneme uvolnit pole smernikov
- delete[] p->next;
- // uvolnenie samotneho uzla
- delete p;
- }
- }
- /* Funkcia dostane smernik na prvy uzol spajaneho zoznamu
- * a vypise tento zoznam vo formate uvedenom v zadani */
- void vypis(node *first) {
- if(first == NULL){
- return;
- }
- cout << "data " << first->data << " next";
- for(int i = 0; i < first->size; i++){
- cout << " ";
- if (first->next[i] == NULL){
- cout << "NULL";
- } else {
- cout << first->next[i]->data;
- }
- }
- cout << endl;
- vypis(first->next[0]);
- }
- int main(void) {
- /* nacitame zoznam */
- node *first = read();
- /* vypiseme uzly zoznamu */
- vypis(first);
- /* uvolnime pamat */
- destroy(first);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement