Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ เพื่อใช้งาน Hash Tables Chaining ด้วย List Heads


ตารางแฮชเป็นโครงสร้างข้อมูลที่ใช้เก็บคู่คีย์-ค่า ฟังก์ชันแฮชถูกใช้โดยตารางแฮชเพื่อคำนวณดัชนีลงในอาร์เรย์ที่จะแทรกหรือค้นหาองค์ประกอบ

นี่คือโปรแกรม C++ ที่ใช้เชื่อมโยงตารางแฮชกับส่วนหัวของรายการ

อัลกอริทึม

สำหรับการแทรก:

Begin
   Declare function Insert(int k, int v)
      int hash_v = HashFunc(k)
      if (ht[hash_v] == NULL)
         ht[hash_v] = new ListHead(k, v)
      else
         ListHead *en = ht[hash_v]
         while (en->n != NULL)
            en = en->n
         if (en->k == k)
            en->v = v
         else
            en->n= new ListHead(k, v)
End.

สำหรับการค้นหาค่าคีย์:

Begin
   Decla Function SearchKey(int k)
      int hash_v = HashFunc(k)
      if (ht[hash_v] == NULL)
         return -1
      else
         ListHead *en = ht[hash_v]
         while (en != NULL and en->k != k)
            en= en->n
         if (en== NULL)
            return -1
         else
            return en->v
End

สำหรับการลบ:

Begin
   Declare Function Remove(int k)
      int hash_v = HashFunc(k)
      if (ht[hash_v] != NULL)
         ListHead *en = ht[hash_v];
         ListHead *p= NULL;
         while (en->n != NULL and en->k != k)
            p = en
            en = en->n
         if (en->k== k)
            if (p == NULL)
               ListHead *n= en->n
               delete en;
               ht[hash_v] = n
            else
               ListHead *n= en->n
               delete en
               p->n = n
End.


โค้ดตัวอย่าง

#include <iostream>
using namespace std;
const int T_S = 20;
class ListHead {
   public:
      int k, v;
      ListHead *n;
      ListHead(int k, int v) {
         this->k = k;
         this->v = v;
         this->n = NULL;
      }
};
class HashMapTable {
   private:
      ListHead **ht;
   public:
      HashMapTable() {
         ht = new ListHead*[T_S];
         for (int i = 0; i < T_S; i++) {
            ht[i] = NULL;
         }
      }
      int HashFunc(int k){
         return k % T_S;
      }
      void Insert(int k, int v) {
         int hash_v = HashFunc(k);
         if (ht[hash_v] == NULL)
            ht[hash_v] = new ListHead(k, v);
         else {
            ListHead *en = ht[hash_v];
            while (en->n != NULL)
               en = en->n;
            if (en->k == k)
               en->v = v;
            else
               en->n= new ListHead(k, v);
         }
      }
      int SearchKey(int k) {
         int hash_v = HashFunc(k);
         if (ht[hash_v] == NULL)
            return -1;
         else {
            ListHead *en = ht[hash_v];
            while (en != NULL && en->k != k)
               en= en->n;
            if (en == NULL)
               return -1;
            else
               return en->v;
         }
      }
      void Remove(int k) {
         int hash_v = HashFunc(k);
         if (ht[hash_v] != NULL) {
            ListHead *en = ht[hash_v];
            ListHead *p = NULL;
            while (en->n != NULL && en->k != k) {
               p = en;
               en = en->n;
            }
            if (en->k == k) {
               if (p == NULL) {
                  ListHead *n= en->n;
                  delete en;
                  ht[hash_v] = n;
               }
               else {
                  ListHead *n = en->n;
                  delete en;
                  p->n = n;
               }
            }
         }
      }
      ~HashMapTable() {
         delete[] ht;
      }
   }
};
int main() {
   HashMapTable hash;
   int k, v;
   int c;
   while(1) {
      cout<<"1.Insert element into the table"<<endl;
      cout<<"2.Search element from the key"<<endl;
      cout<<"3.Delete element at a key"<<endl;
      cout<<"4.Exit"<<endl;
      cout<<"Enter your choice: ";
      cin>>c;
      switch(c) {
         case 1:
            cout<<"Enter element to be inserted: ";
            cin>>v;
            cout<<"Enter key at which element to be inserted: ";
            cin>>k;
            hash.Insert(k, v);
         break;
         case 2:
            cout<<"Enter key of the element to be searched: ";
            cin>>k;
            if (hash.SearchKey(k) == -1)
               cout<<"No element found at key "<<k<<endl;
            else {
               cout<<"Elements at key "<<k<<" : ";
               cout<<hash.SearchKey(k)<<endl;
            }
         break;
         case 3:
            cout<<"Enter key of the element to be deleted: ";
            cin>>k;
            if (hash.SearchKey(k) == -1)
               cout<<"Key "<<k<<" is empty"<<endl;
            else {
               hash.Remove(k);
               cout<<"Entry Removed"<<endl;
            }
         break;
         case 4:
            exit(1);
         default:
            cout<<"\nEnter correct option\n";
      }
   }
   return 0;
}



ผลลัพธ์

1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 1
Enter element to be inserted: 1
Enter key at which element to be inserted: 2
1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 1
Enter element to be inserted: 10
Enter key at which element to be inserted: 1
1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 1
Enter element to be inserted: 7
Enter key at which element to be inserted: 6
1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 1
Enter element to be inserted: 12
Enter key at which element to be inserted: 4
1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 30
Enter correct option
1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 1
Enter element to be inserted: 30
Enter key at which element to be inserted: 5
1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 2
Enter key of the element to be searched: 6
Elements at key 6 : 7
1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 3
Enter key of the element to be deleted: 1
Entry Removed
1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 2
Enter key of the element to be searched: 6
Elements at key 6 : 7
1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 4