First, I want to write it in a sink. But at the end of the article, the system was dizzy. No way. Use C ++ to verify your ideas. The Code is as follows.
- Chashmap: chashmap ()
- {
- M_size = 100;
- M_count = 0;
- M_nodes = (pcnode) malloc (sizeof (cNode) * 100 );
- Zeromemory (m_nodes, sizeof (cNode) * 100 );
- }
- Chashmap ::~ Chashmap ()
- {
- For (INT I = 0; I <m_size; I ++)
- {
- Pcnode cur_node = m_nodes + I;
- If (cur_node-> left)
- _ Del_x (cur_node-> left );
- If (cur_node-> right)
- _ Del_x (cur_node-> right );
- }
- Free (m_nodes );
- }
- Bool chashmap: Set (DWORD key, DWORD Value)
- {
- If (m_count/m_size >=0.72)
- {
- // The size of the rebuilt hash table is double that of the original hash table.
- DWORD new_size = m_size * 2;
- Pcnode new_nodes = (pcnode) malloc (sizeof (cNode) * new_size );
- Zeromemory (new_nodes, sizeof (cNode) * new_size );
- For (INT I = 0; I <m_size; I ++)
- {
- Pcnode cur_node = m_nodes + I;
- If (cur_node-> key)
- {
- // Add the current node.
- Pcnode add_node = _ getaddress_x (new_nodes, new_size, cur_node-> key );
- If (add_node) add_node-> value = cur_node-> value;
- // Traverse the child node and delete the old one.
- If (cur_node-> right)
- _ Setanddel_x (new_nodes, new_size, cur_node-> right );
- If (cur_node-> left)
- _ Setanddel_x (new_nodes, new_size, cur_node-> left );
- }
- }
- // Delete the old one.
- Free (m_nodes );
- M_nodes = new_nodes;
- M_size = new_size;
- }
- Pcnode node;
- If (node = _ getaddress_x (m_nodes, m_size, key ))
- {
- Node-> value = value;
- M_count ++;
- Return true;
- }
- Return false;
- }
- DWORD chashmap: Get (DWORD key)
- {
- // Locate the data first. Compare the key value to find the node. Finally, return the required value.
- DWORD Pos = Key % m_size;
- Pcnode node = m_nodes + Pos;
- While (node ){
- If (Key> node-> key)
- Node = node-> right;
- Else if (Key <node-> key)
- Node = node-> left;
- Else
- Return node-> value;
- }
- Return NULL;
- }
- Bool chashmap: exists (DWORD key)
- {
- DWORD Pos = Key % m_size;
- Pcnode node = m_nodes + Pos;
- While (node ){
- If (Key> node-> key)
- Node = node-> right;
- Else if (Key <node-> key)
- Return true;
- Else
- Return node-> value;
- }
- Return false;
- }
- Bool chashmap: del (DWORD key)
- {
- DWORD Pos = Key % m_size;
- Pcnode par_node = NULL, cur_node, node = m_nodes + Pos;
- If (null = node-> key) return false;
- While (node ){
- If (Key> node-> key ){
- Par_node = node;
- Node = node-> right;
- } Else if (Key <node-> key ){
- Par_node = node;
- Node = node-> left;
- } Else {
- Cur_node = node;
- Break;
- }
- }
- If (! Node) return false; // no result is returned.
- If (! Par_node) // Root Node
- {
- If (cur_node-> right)
- {
- Pcnode left_node = cur_node-> left;
- * Cur_node = * cur_node-> right;
- If (left_node ){
- // Mount it to the leftmost.
- While (cur_node-> left ){
- Cur_node = cur_node-> left;
- }
- Cur_node-> left = left_node;
- }
- } Else if (cur_node-> left)
- {
- // If no right node exists.
- * Cur_node = * cur_node-> left;
- } Else {
- // Nothing
- Cur_node-> value = cur_node-> key = 0;
- Cur_node-> left = cur_node-> right = NULL;
- }
- Return true;
- }
- /* Release cur_node if it is not the root node */
- If (cur_node-> right ){
- Par_node-> right = cur_node-> right;
- // The left node is mounted to the far left of the right.
- If (cur_node-> left ){
- Node = cur_node;
- While (node-> left) {node = node-> left ;}
- Node-> left = cur_node-> left;
- }
- } Else if (cur_node-> left ){
- // The right side does not exist.
- Par_node-> left = cur_node-> left;
- } Else
- {
- If (par_node-> left = cur_node)
- Par_node-> left = NULL;
- Else
- Par_node-> right = NULL;
- }
- Free (cur_node );
- Return true;
- }
- // This is a static method. Copy a new node and delete it.
- Void chashmap: _ setanddel_x (pcnode arg_nodes, DWORD arg_size, pcnode arg_node)
- {
- Pcnode add_node = _ getaddress_x (arg_nodes, arg_size, arg_node-> key );
- If (add_node) add_node-> value = arg_node-> value;
- If (arg_node-> right)
- _ Setanddel_x (arg_nodes, arg_size, arg_node-> right );
- If (arg_node-> left)
- _ Setanddel_x (arg_nodes, arg_size, arg_node-> left );
- Free (arg_node );
- }
- Void chashmap: _ del_x (pcnode arg_node)
- {
- If (arg_node-> right)
- _ Del_x (arg_node );
- If (arg_node-> left)
- _ Del_x (arg_node );
- Free (arg_node );
- }
- /*
- If data with the same key value exists, null is returned.
- This method is static.
- If it exists, it will give me a space. If not. It allocates a new address.
- */
- Pcnode chashmap: _ getaddress_x (pcnode arg_node, DWORD arg_size, DWORD key)
- {
- DWORD Pos = Key % arg_size;
- Pcnode t_node, node = arg_node + Pos;
- If (node-> key = 0 ){
- Node-> key = key;
- Return node;
- }
- While (node)
- {
- T_node = node;
- If (Key> node-> key)
- Node = node-> right;
- Else if (Key = node-> key)
- Return NULL;
- Else
- Node = node-> left;
- }
- Node = (pcnode) malloc (sizeof (cNode ));
- Node-> key = key; node-> left = node-> right = NULL;
- If (Key> t_node-> key)
- T_node-> right = node;
- Else
- T_node-> left = node;
- Return node;
- }
Header file:
- Class chashmap
- {
- Public:
- Chashmap ();
- Bool set (DWORD key, DWORD Value); // sets data
- DWORD size () {return m_size;} // take the capacity size
- DWORD count () {return m_count;} // Number of Retrieved Data
- DWORD get (DWORD key); // retrieves data
- Bool del (DWORD key); // delete data
- Bool exists (DWORD key); // whether the data exists
- Virtual ~ Chashmap ();
- PRIVATE:
- Static pcnode _ getaddress_x (pcnode arg_node, DWORD arg_size, DWORD key );
- Static void _ setanddel_x (pcnode arg_nodes, DWORD arg_size, pcnode arg_node );
- Void _ del_x (pcnode arg_node );
- Protected:
- DWORD m_size;
- DWORD m_count;
- Pcnode m_nodes;
- };