Advertisement
wilk_maciej

Map_on_bst

Jun 15th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <string.h>
  3.  
  4. template<class K, class V>
  5. class Map;
  6.  
  7. template<class K, class V>
  8. class Element{
  9. public:
  10.   friend class Map<K, V>;
  11.   friend class Map<K, V>::Iterator;
  12.   Element<K, V> *parent;
  13.   Element<K, V> *right;
  14.   Element<K, V> *left;
  15.   K first;
  16.   V second;
  17.  
  18.   Element<K, V>(){
  19.     right=NULL;
  20.     left=NULL;
  21.     parent=NULL;
  22.   }
  23. };
  24.  
  25. template<class K, class V>
  26. class Map{
  27. public:
  28.   Element<K,V> *root;
  29.  
  30.   Map<K,V>(){
  31.     root=NULL;
  32.   }
  33.  
  34.   void Usun_poddrzewo(Element<K,V> *small_tree_root){
  35.     if (small_tree_root!=NULL){
  36.       Usun_poddrzewo(small_tree_root->right);
  37.       Usun_poddrzewo(small_tree_root->left);
  38.       delete small_tree_root;
  39.     }
  40.   }
  41.  
  42.   ~Map(){
  43.     Usun_poddrzewo(root);
  44.     root=NULL;
  45.   }
  46.  
  47.   V & operator [](const K &key){
  48.     Element<K, V> *jumper = root, *newElement, *jumperParent = NULL;
  49.  
  50.     while(jumper){
  51.       if (key == jumper->first) return jumper->second;
  52.  
  53.       else if (key < jumper -> first){
  54.         jumperParent = jumper;
  55.         jumper = jumper -> left;
  56.       }
  57.       else{
  58.         jumperParent = jumper;
  59.         jumper = jumper -> right;
  60.       }
  61.  
  62.     }
  63.  
  64.     newElement = new Element<K,V>;
  65.     newElement -> first = key;
  66.     newElement -> left = NULL;
  67.     newElement -> right = NULL;
  68.  
  69.     if (!root){
  70.       root=newElement;
  71.       newElement -> parent = NULL;
  72.     }
  73.  
  74.     else{
  75.       newElement -> parent = jumperParent;
  76.       if (key < jumperParent -> first) jumperParent -> left = newElement;
  77.       else jumperParent -> right = newElement;
  78.     }
  79.  
  80.     return newElement -> second;
  81.   }
  82.  
  83.  
  84.   class Iterator{
  85.     public:
  86.     Element <K,V> *ws;
  87.  
  88.     Iterator(){
  89.       ws=NULL;
  90.     }
  91.  
  92.     int operator !=(const Iterator &o1){
  93.       if(ws!=o1.ws) return 1;
  94.       return 0;
  95.     }
  96.  
  97.    
  98.  
  99.     Iterator operator ++(int){
  100.       if (ws -> right){
  101.         ws = ws -> right;
  102.         while(ws -> left) ws = ws->left;
  103.       return *this;
  104.       }
  105.  
  106.       Element<K,V> *jumper = ws->parent;
  107.       while (jumper != NULL && ws == jumper->right){
  108.         ws=jumper;
  109.         jumper = jumper -> parent;
  110.       }
  111.  
  112.       ws = jumper;
  113.       return *this;
  114.     }
  115.  
  116.  
  117.     Element<K,V> * operator ->(void){
  118.       return ws;
  119.     }
  120.  
  121.   };
  122.  
  123.  
  124.   Iterator begin(void){
  125.     Iterator i1;
  126.     i1.ws=root;
  127.     while (i1.ws -> left !=NULL) i1.ws = i1.ws->left;
  128.     return i1;
  129.   }
  130.  
  131.  
  132.   Iterator end(void){
  133.     Iterator i1;
  134.     i1.ws=NULL;
  135.     return i1;
  136.   }
  137.  
  138. };
  139.  
  140.  
  141. int main() {
  142.     Map<int, std::string> o1;
  143.     o1[4] = "ten tekst bedzie podmieniony wiecc sie nie wyswietli";
  144.     o1[531] = "losowy tekst 0";
  145.     o1[21] = "losowy tekst 1";
  146.     o1[0] = "losowy tekst 2";
  147.     o1[-7] = "losowy tekst 3";
  148.     o1[-3] = "losowy tekst 4";
  149.     o1[69] = "losowy tekst 5";
  150.     o1[112] = "losowy tekst 6";
  151.     o1[81] = "losowy tekst 7";
  152.     o1[9] = "losowy tekst 8";
  153.     o1[7] = "losowy tekst 9";
  154.     o1[13] = "losowy tekst 10";
  155.     o1[4] = "podmienione w[4]";
  156.  
  157.     for(Map<int,std::string>::Iterator i = o1.begin(); i!= o1.end(); i++) {
  158.         std::cout << i->first << "  " << i->second << '\n';
  159.     }
  160.     return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement