• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 183,  comments - 10,  trackbacks - 0

            最初想法來自于《編程珠璣》,下午實現了一下
            不多說了,直接看代碼吧

              1 //
              2 //    HashTable
              3 //
              4 //    goonyangxiaofang(AT)163(DOT)com
              5 //    QQ: 五九一二四七八七六
              6 //
              7 
              8 #include <iostream>
              9 #include <string>
             10 
             11 #define MYTRACE(t, f) std::cout << #t": " << t << std::endl; if(f == 1) std::cin.get()
             12 #define PRINTNAME(name) std::cout << #name": " << std::endl
             13 
             14 template <typename Key, typename Data, unsigned int prime = 11>
             15 class HashTable
             16 {
             17     struct Node
             18     {
             19         Key   key;
             20         Data  data;
             21         Node* next;
             22         Node() : next(0) {}
             23         Node(const Key& k) : key(k), next(0) {}
             24         Node(const Key& k, const Data& d) : key(k), data(d), next(0) {}
             25         Node(const Key& k, const Data& d, const Node* p) : key(k), data(d), next(p) {}
             26         Node(const Node& n) : key(n.key), data(n.data), next(n.next) {}
             27         ~Node() {}
             28     };
             29     Node** table;
             30 private:
             31     unsigned int getKey(const Key& k)
             32     {
             33         unsigned int ret = 0;
             34         char* h = reinterpret_cast<char*>(const_cast<Key*>(&k));
             35         for (unsigned int i = 0; i < sizeof (Key); ++i)
             36         {
             37             ret += static_cast<unsigned int>(h[i]) * 10;
             38         }
             39         return ret % prime;
             40     }
             41 public:
             42     HashTable()
             43     {
             44         table = new Node*[prime];
             45         for (unsigned int i = 0; i < prime; ++i)
             46         {
             47             table[i] = 0;
             48         }
             49     }
             50     HashTable(const HashTable& ht)
             51     {
             52         table = new Node*[prime];
             53         for (unsigned int i = 0; i < prime; ++i)
             54         {
             55             table[i] = 0;
             56             Node** p = &(table[i]);
             57             Node*  q = ht.table[i];
             58             while (q)
             59             {
             60                 Node* r = new Node(q->key, q->data);
             61                 *= r;
             62                 p = &(r->next);
             63                 q = q->next;
             64             }
             65         }
             66     }
             67     HashTable& operator=(const HashTable& ht)
             68     {
             69         if (this != &ht)
             70         {
             71             clear();
             72             table = new Node*[prime];
             73             for (unsigned int i = 0; i < prime; ++i)
             74             {
             75                 table[i] = 0;
             76                 Node** p = &table[i];
             77                 Node*  q = ht.table[i];
             78                 while (q)
             79                 {
             80                     Node* r = new Node(q->key, q->data);
             81                     *= r;
             82                     p = &(r->next);
             83                     q = q->next;
             84                 }
             85             }
             86         }
             87         return * this;
             88     }
             89     bool find(const Key& k)
             90     {
             91         Node* p = table[getKey(k)];
             92         while (p)
             93         {
             94             if (k == p->key)
             95             {
             96                 return true;
             97             }
             98             p = p->next;
             99         }
            100         return false;
            101     }
            102     bool insert(const Key& k, const Data& d)
            103     {
            104         if (find(k))
            105         {
            106             return true;
            107         }
            108         unsigned int key = getKey(k);
            109         Node*& p = table[key];
            110         Node* q = new Node(k, d);
            111         if (q == 0)
            112         {
            113             return false;
            114         }
            115         q->next = p;
            116         p = q;
            117         return true;
            118     }
            119     bool insert(const Key& k)
            120     {
            121         if (find(k))
            122         {
            123             return true;
            124         }
            125         unsigned int key = getKey(k);
            126         Node*& p = table[key];
            127         Node* q = new Node(k);
            128         if (q == 0)
            129         {
            130             return false;
            131         }
            132         q->next = p;
            133         p = q;
            134         return true;
            135     }
            136     Data& get(const Key& k)
            137     {
            138         Node* p = table[getKey(k)];
            139         while (p)
            140         {
            141             if (k == p->key)
            142             {
            143                 return p->data;
            144             }
            145             p = p->next;
            146         }
            147         insert(k);
            148         Data d;
            149         return d;
            150     }
            151     const Data& operator[](const Key& k) const
            152     {
            153         Node* p = table[getKey(k)];
            154         while (p)
            155         {
            156             if (k == p->key)
            157             {
            158                 return p->data;
            159             }
            160             p = p->next;
            161         }
            162         insert(k);
            163         Data d;
            164         return d;
            165     }
            166     Data& operator[](const Key& k)
            167     {
            168         Node* p = table[getKey(k)];
            169         while (p)
            170         {
            171             if (k == p->key)
            172             {
            173                 return p->data;
            174             }
            175             p = p->next;
            176         }
            177         insert(k);
            178         Data d;
            179         return d;
            180     }
            181     bool empty()
            182     {
            183         for (unsigned int i = 0; i < prime; ++i)
            184         {
            185             if (table[i] != 0)
            186             {
            187                 return false;
            188             }
            189         }
            190         return true;
            191     }
            192     void print()
            193     {
            194         std::cout << std::endl;
            195         for (unsigned int i = 0; i < prime; ++i)
            196         {
            197             Node* p = table[i];
            198             std::cout << i << "";
            199             while (p)
            200             {
            201                 std::cout << "" << p->key << "" << p->data << " ) ";
            202                 p = p->next;
            203             }
            204             std::cout << std::endl;
            205         }
            206         std::cout << std::endl;
            207     }
            208     void clear()
            209     {
            210         for (unsigned int i = 0; i < prime; ++i)
            211         {
            212             Node* p = table[i];
            213             Node* q = p;
            214             while (p)
            215             {
            216                 p = p->next;
            217                 delete q;
            218                 q = p;
            219             }
            220         }
            221         delete [] table;
            222     }
            223     ~HashTable()
            224     {
            225         clear();
            226     }
            227 };
            228 
            229 int main()
            230 {
            231     HashTable<long, std::string> ht1;
            232     for (long i = 0; i < 26++i)
            233     {
            234         std::string s;
            235         s += 'A' + i;
            236         ht1.insert(i, s);
            237     }
            238     PRINTNAME(ht1);
            239     ht1.print();
            240 
            241     for (long i = 0; i < 26++i)
            242     {
            243         std::string s;
            244         s += 'A' + i;
            245         ht1.insert(i, s);
            246     }
            247     PRINTNAME(ht1);
            248     ht1.print();
            249 
            250     HashTable<long, std::string> ht2(ht1);
            251     PRINTNAME(ht2);
            252     ht2.print();
            253 
            254     ht1[25= "xxxxxxxx";
            255     ht1.print();
            256     ht2.print();
            257 
            258     HashTable<long, std::string> ht3;
            259     ht3 = ht1;
            260     PRINTNAME(ht3);
            261     ht3.print();
            262     return 0;
            263 }
            posted on 2011-03-09 18:57 unixfy 閱讀(429) 評論(0)  編輯 收藏 引用
            国产精品欧美久久久久无广告| 99久久无色码中文字幕人妻| 精品久久久久久无码人妻蜜桃| 久久久久人妻一区精品| 久久精品无码一区二区WWW| 精品久久久久久无码专区| 久久久久无码精品| 久久精品人人做人人妻人人玩| 久久精品国产99国产精品| 新狼窝色AV性久久久久久| 色偷偷888欧美精品久久久| 久久婷婷人人澡人人爽人人爱| 精品久久8x国产免费观看| 亚洲&#228;v永久无码精品天堂久久| 日韩AV无码久久一区二区| 怡红院日本一道日本久久 | 午夜精品久久久久久99热| 99久久婷婷国产一区二区| 亚洲国产另类久久久精品小说| 久久精品无码一区二区app| 精品久久久久香蕉网| 97久久婷婷五月综合色d啪蜜芽| a级毛片无码兔费真人久久| 国产精品久久久久久吹潮| 亚洲国产精品无码久久| 思思久久精品在热线热| 欧美亚洲国产精品久久| 亚洲伊人久久综合中文成人网| 久久青青草原精品国产不卡| 香蕉久久一区二区不卡无毒影院| 色综合久久无码中文字幕| 久久精品日日躁夜夜躁欧美| 久久亚洲中文字幕精品一区| 香蕉aa三级久久毛片| 中文精品99久久国产| 中文字幕精品久久久久人妻| 免费一级做a爰片久久毛片潮| 久久精品中文字幕第23页| 日韩欧美亚洲综合久久影院Ds| 久久综合五月丁香久久激情| 久久综合狠狠综合久久97色|