C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

二重リンクリストを使用したハッシュテーブルチェーンを実装するC++プログラム


ハッシュテーブルは、キーと値のペアを格納するために使用されるデータ構造です。ハッシュ関数は、要素が挿入または検索される配列へのインデックスを計算するためにハッシュテーブルによって使用されます。

これは、二重にリンクされたリストを使用してハッシュテーブルチェーンを実装するためのC++プログラムです。

アルゴリズム

挿入の場合:

Begin
   Declare Function insert(int k, int v)
      int hash_v= HashFunc(k)
      HashTableEntry *en = ht[hash_v]
      if (en == NULL)
         en = new HashTableEntry
         en->d = v
         en->k = k
         en->n = NULL
         en->p = NULL
         ht[hash_v] = en
         top[hash_v] = en
      else
         while (en != NULL)
            en = en->n
         en = new HashTableEntry
         en->d = v
         en->k = k
         en->n = NULL
         en->p = top[hash_v]
         top[hash_v]->n = en
         top[hash_v] = en
End

削除の場合:

Begin
   Declare function remove(int k)
      int hash_v = HashFunc(k)
      HashTableEntry *en = ht[hash_v]
      if (en->k != k || en == NULL)
         Print No Element found at key
         return
      while (en != NULL)
         if (en->n == NULL)
            if (en->p == NULL)
               ht[hash_v] = NULL
               top[hash_v] = NULL
               delete en
               break

            else
               top[hash_v] = en->p
               top[hash_v]->n = NULL
               delete en
               en = top[hash_v]
         en = en->n
End

キー値を検索する場合:

Begin
   Declare function SearchKey(int k)
      int hash_v = HashFunc(k)
      bool flag = false
      HashTableEntry* en = ht[hash_v]
      if (en != NULL)
         while (en != NULL)
            if (en->k == k)
               flag = true
            if (flag)
               Print Element found at key
               print en->d
     
            en = en->n
         if (!flag)
            Print “No Element found at key.”
End.

サンプルコード

#include <iostream>
const int T_S = 200;
using namespace std;
struct HashTableEntry {
   int d, k;
   HashTableEntry *n;
   HashTableEntry *p;
};
class HashMapTable {
   public:
      HashTableEntry **ht, **top;
      HashMapTable() {
         ht = new HashTableEntry*[T_S];
         top = new HashTableEntry*[T_S];
         for (int i = 0; i < T_S; i++) {
         ht[i] = NULL;
         top[i] = NULL;
      }
}
int HashFunc(int key) {
   return key % T_S;
}
void insert(int k, int v) {
   int hash_v= HashFunc(k);
   HashTableEntry *en = ht[hash_v];
   if (en == NULL) {
      en = new HashTableEntry;
      en->d = v;
      en->k = k;
      en->n = NULL;
      en->p = NULL;
      ht[hash_v] = en;
      top[hash_v] = en;
   } else {
      while (en != NULL)
      en = en->n;
      en = new HashTableEntry;
      en->d = v;
      en->k = k;
      en->n = NULL;
      en->p = top[hash_v];
      top[hash_v]->n = en;
      top[hash_v] = en;
   }
}
void remove(int k) {
   int hash_v = HashFunc(k);
   HashTableEntry *en = ht[hash_v];
   if (en->k != k || en == NULL) {
      cout<<"No Element found at key: "<<k<<endl;
      return;
   }
   while (en != NULL) {
      if (en->n == NULL) {
         if (en->p == NULL) {
            ht[hash_v] = NULL;
            top[hash_v] = NULL;
            delete en;
            break;
         } else {
            top[hash_v] = en->p;
            top[hash_v]->n = NULL;
            delete en;
            en = top[hash_v];
         }
      }
      en = en->n;
   }
}
void SearchKey(int k) {
   int hash_v = HashFunc(k);
   bool flag = false;
   HashTableEntry* en = ht[hash_v];
   if (en != NULL) {
      while (en != NULL) {
         if (en->k == k) {
            flag = true;
         }
         if (flag) {
            cout<<"Element found at key "<<k<<": ";
            cout<<en->d<<endl;
         }
         en = en->n;
      }
   }
   if (!flag)
      cout<<"No Element found at key "<<k<<endl;
}
~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;
            hash.SearchKey(k);
         break;
         case 3:
            cout<<"Enter key of the element to be deleted: ";
            cin>>k;
            hash.remove(k);
         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: 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: 2
Enter key at which element to be inserted: 3
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: 4
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
Element found 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
1.Insert element into the table
2.Search element from the key
3.Delete element at a key
4.Exit
Enter your choice: 4

  1. C++で二重にリンクされた循環リスト

    循環リンクリストは、最初の要素が最後の要素を指し、最後の要素が最初の要素を指すリンクリストのバリエーションです。単一リンクリストと二重リンクリストの両方を循環リンクリストにすることができます。 二重リンクリストでは、最後のノードの次のポインタが最初のノードを指し、最初のノードの前のポインタが最後のノードを指し、両方向に循環します。 上の図のように、考慮すべき重要なポイントは次のとおりです。 最後のリンクの次は、二重リンクリスト内のリストの最初のリンクを指します。 最初のリンクの前のポイントは、二重にリンクされたリストの最後を指します。 アルゴリズム displayFo

  2. C++で二重リンクリストのサイズを見つけるプログラム

    この問題では、二重にリンクされたリストが与えられます。私たちのタスクは、C++で二重リンクリストのサイズを見つけるプログラムを作成することです。 二重リンクリストは特殊なタイプのリンクリストであり、単一リンクリストと比較して、順方向と逆方向の両方の方法で簡単にナビゲーションできます。以下は、二重リンクリストの概念を理解するための重要な用語です。 リンク-リンクリストの各リンクには、要素と呼ばれるデータを格納できます。 次へ-リンクリストの各リンクには、次と呼ばれる次のリンクへのリンクが含まれています。 前-リンクリストの各リンクには、前と呼ばれる前のリンクへのリンクが含ま