Advertisement
Gilgamesh858

Hash.cpp

Feb 9th, 2016
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <math.h>
  4. #include "List.cpp"
  5. using namespace std;
  6.  
  7. template <class T> class HashTable {
  8.     public:
  9.         virtual HashTable<T>* insert(T x) = 0;
  10.         virtual int search(T x) = 0;
  11.         virtual HashTable<T>* del(T x) = 0;
  12. };
  13.  
  14. template <class H> class LinkedHashTable : public HashTable<H> {
  15.     private:
  16.         virtual int hash(H x) = 0;
  17.         int m;
  18.         int size;
  19.         LinkedList<H> **t;
  20.        
  21.     public:
  22.         LinkedHashTable<H>(int m) {
  23.             t = new LinkedList<H>*[m];
  24.             for(int i=0; i<m; i++) t[i] = new LinkedList<H>();
  25.             this->size = 0;
  26.             this->m = m;
  27.         }
  28.        
  29.         int getm() {return m;}
  30.         void setm(int m) {this->m = m;}
  31.         int getSize() {return size;}
  32.         //void setSize(int size) {this->size = size;}
  33.        
  34.         LinkedHashTable<H>* insert(H x) {
  35.             int p = hash(x);
  36.             t[p]->insert(x);
  37.             size++;
  38.             return this;
  39.         }
  40.        
  41.         int search(H x) {
  42.             int p = hash(x);
  43.             return t[p]->search(x);
  44.         }
  45.        
  46.         LinkedHashTable<H>* del(H x) {
  47.             int p = hash(x);
  48.             if(t[p]->search(x)) {
  49.                 t[p]->del(x);
  50.                 size--;
  51.             }
  52.             return this;
  53.         }
  54.        
  55.         void print() {
  56.             for(int i=0; i<m; i++) {
  57.                 cout << "[" << i << "] -> ";
  58.                 t[i]->print();
  59.                 cout << endl;
  60.             }
  61.             cout << endl;
  62.         }
  63. };
  64.  
  65.  
  66. template <class H> class DivLinkedHashTable : public LinkedHashTable<H> {
  67.     private:
  68.         int hash(H x) {
  69.             int h = ((int)x % this->getm());
  70.             return h;
  71.         }
  72.     public:
  73.         DivLinkedHashTable(int m) : LinkedHashTable<H>(m) {}
  74. };
  75.  
  76. template <class H> class MulLinkedHashTable : public LinkedHashTable<H> {
  77.     private:
  78.         double c;
  79.         int hash(H x) {
  80.             double y = (int)x * c;
  81.             double a = y - (int)y;
  82.             int h = a * this->getm();
  83.             return h;
  84.         }
  85.     public:
  86.         MulLinkedHashTable(int m) : LinkedHashTable<H>(m) {
  87.             c = 0.7;
  88.         }
  89. };
  90.  
  91.  
  92. template <class H> class OpenHashTable : public HashTable<H> {
  93.     private:
  94.         virtual int hash(H x, int i) = 0;
  95.         int m;
  96.         int size;
  97.         H **t;
  98.         H *deleted;
  99.        
  100.     public:
  101.         OpenHashTable<H>(int m) {
  102.             t = new H*[m];
  103.             for(int i=0; i<m; i++) t[i] = NULL;
  104.             this->size = 0;
  105.             this->m = m;
  106.             deleted = new H();
  107.         }
  108.        
  109.         int getm() {return m;}
  110.         void setm(int m) {this->m = m;}
  111.         int getSize() {return size;}
  112.        
  113.         OpenHashTable<H>* insert(H x) {
  114.             if(size==m) return this;
  115.             int i=0;
  116.             int p = hash(x,i);
  117.             while(i<m && t[p]!=NULL && t[p]!=deleted) {
  118.                 i++;
  119.                 p = hash(x,i);
  120.             }
  121.             if(t[p]==NULL || t[p]==deleted) t[p] = new H(x);
  122.             return this;
  123.         }
  124.        
  125.         int search(H x) {
  126.             int i=0;
  127.             int p = hash(x,i);
  128.             while(i<m && t[p]!=NULL) {
  129.                 if( t[p]!=deleted && *t[p]==x ) return 1;
  130.                 i++;
  131.                 p = hash(x,i);
  132.             }
  133.             return 0;
  134.         }
  135.        
  136.         OpenHashTable<H>* del(H x) {
  137.             int i=0;
  138.             int p = hash(x,i);
  139.             while(i<m && t[p]!=NULL) {
  140.                 if( *t[p]==x ) {
  141.                     t[p] = deleted;
  142.                     return this;
  143.                 }
  144.                 i++;
  145.                 p = hash(x,i);
  146.             }
  147.             return this;
  148.         }
  149.        
  150.         void print() {
  151.             for(int i=0; i<m; i++) {
  152.                 if(t[i] && t[i]!=deleted) cout << "[" << i << "] -> " << *t[i];
  153.                 else cout << "[" << i << "] -> //";
  154.                 cout << endl;
  155.             }
  156.             cout << endl;
  157.         }
  158. };
  159.  
  160. template <class H> class LinearOpenHashTable : public OpenHashTable<H> {
  161.     private:
  162.         int hash(H x, int i) {
  163.             return (((int)x % this->getm()) + i) % this->getm();
  164.         }
  165.     public:
  166.         LinearOpenHashTable(int m) : OpenHashTable<H>(m) {
  167.         }
  168. };
  169.  
  170.  
  171. int main() {
  172.     LinearOpenHashTable<int> *T1 = new LinearOpenHashTable<int>(11);
  173.     T1->insert(4)->insert(34)->insert(31)->insert(56)->insert(51)->insert(44)->insert(33)->insert(77)->insert(50);
  174.     T1->del(34)->del(77);
  175.     T1->insert(77)->insert(22);
  176.     T1->print();
  177.     return 1;
  178. }
  179.  
  180.  
  181. ______________________________________________________________________________________________________________________
  182. ______________________________________________________________________________________________________________________
  183.  
  184. /*List*/
  185.  
  186. #include <iostream>
  187. #include <ctime>
  188. #include <math.h>
  189. using namespace std;
  190.  
  191. template <class T> class List {
  192.     public:
  193.         virtual List<T>* insert(T x) = 0;
  194.         virtual List<T>* del(T x) = 0;
  195.         virtual int search(T x) = 0;
  196. };
  197.  
  198. template <class C> class Node {
  199.     private:
  200.         C key;
  201.         Node<C> *next;
  202.     public:
  203.         Node<C>(C key) {
  204.             this->key = key;
  205.             this->next = NULL;
  206.         }
  207.         void setKey(C key) {
  208.             this->key = key;
  209.         }
  210.         void setNext(Node<C> *next) {
  211.             this->next = next;
  212.         }
  213.         C getKey() {
  214.             return key;
  215.         }
  216.         Node<C>* getNext() {
  217.             return next;
  218.         }
  219. };
  220.  
  221.  
  222. template <class H> class LinkedList : public List<H>{
  223.     private:
  224.         Node<H> *root;
  225.         int size;
  226.     public:
  227.         LinkedList<H>() {
  228.             root = NULL;
  229.             size = 0;
  230.         }
  231.  
  232.         LinkedList<H>* insert(H x) {
  233.             Node<H> *tmp = new Node<H>(x);
  234.             tmp->setNext(root);
  235.             root = tmp;
  236.             size++;
  237.             return this;
  238.         }
  239.  
  240.         LinkedList<H>* del(H x) {
  241.             Node<H> *tmp = root;
  242.             Node<H> *par = NULL;
  243.             while(tmp!=NULL && tmp->getKey()!=x) {
  244.                 par = tmp;
  245.                 tmp=tmp->getNext();
  246.             }
  247.             if(tmp!=NULL) par->setNext(tmp->getNext());
  248.             size--;
  249.             free(tmp);
  250.             return this;
  251.         }
  252.  
  253.         int search(H x) {
  254.             Node<H> *tmp = root;
  255.             while(tmp!=NULL && tmp->getKey()!=x) tmp=tmp->getNext();
  256.             return tmp!=NULL?1:0;
  257.         }
  258.        
  259.         void print() {
  260.             Node<H> *tmp = root;
  261.             while(tmp!=NULL) {
  262.                 cout << tmp->getKey() << " - ";
  263.                 tmp = tmp->getNext();
  264.             }
  265.             cout << "//";
  266.         }
  267. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement