Source of HashedDictionary.cpp


  1: //  Created by Frank M. Carrano and Tim Henry.
  2: //  Copyright (c) 2013 __Pearson Education__. All rights reserved.

  4: /** @file  HashedDictionary.cpp */

  6: // Separate chaining resolves collisions

  8: // PARTIALLY COMPLETE

 10: template <class KeyType, class ItemType>
 11: bool HashedDictionary<KeyType, ItemType>::add(const KeyType& searchKey, const ItemType& newItem)
 12: {
 13:    // Create entry to add to dictionary
 14:    HashedEntry<KeyType, ItemType>* entryToAddPtr =
 15:                   new HashedEntry<KeyType, ItemType>(newItem, searchKey);
 16:    
 17:    // Compute the hashed index into the array
 18:    int itemHashIndex = getHashIndex(searchKey);
 19:    
 20:    // Add the entry to the chain at itemHashIndex
 21:    if (hashTable[itemHashIndex] == nullptr)
 22:    {
 23:       hashTable[itemHashIndex] = entryToAddPtr;
 24:    }
 25:    else
 26:    {
 27:       entryToAddPtr->setNext(hashTable[itemHashIndex]);
 28:       hashTable[itemHashIndex] = entryToAddPtr;
 29:    } // end if
 30:    
 31:    return true;
 32: } // end add

 34: template <class KeyType, class ItemType>
 35: bool HashedDictionary<KeyType, ItemType>::remove(const KeyType& searchKey)
 36: {
 37:    bool itemFound = false;
 38:    
 39:    // Compute the hashed index into the array
 40:    int itemHashIndex = getHashIndex(searchKey);
 41:    if (hashTable[itemHashIndex] != nullptr)
 42:    {
 43:       // Special case - first node has target
 44:       if (searchKey == hashTable[itemHashIndex]->getKey())
 45:       {
 46:          HashedEntry<KeyType, ItemType>* entryToRemovePtr =
 47:          hashTable[itemHashIndex];
 48:          hashTable[itemHashIndex] = hashTable[itemHashIndex]->getNext();
 49:          delete entryToRemovePtr;
 50:          entryToRemovePtr = nullptr; // For safety
 51:          itemFound = true;
 52:       }
 53:       else // Search the rest of the chain
 54:       {
 55:          HashedEntry<KeyType, ItemType>* prevPtr = hashTable[itemHashIndex];
 56:          HashedEntry<KeyType, ItemType>* curPtr = prevPtr->getNext();
 57:          while ((curPtr != nullptr) && !itemFound )
 58:          {
 59:             // Found item in chain so remove that node
 60:             if (searchKey == curPtr->getKey())
 61:             {
 62:                prevPtr->setNext(curPtr->getNext());
 63:                delete curPtr;
 64:                curPtr = nullptr; // For safety
 65:                itemFound = true;
 66:             }
 67:             else // Look at next entry in chain
 68:             {
 69:                prevPtr = curPtr;
 70:                curPtr = curPtr->getNext();
 71:             } // end if
 72:          } // end while
 73:       } // end if
 74:    } // end if
 75:    
 76:    return itemFound;
 77: } // end remove