Answer to Question hash-3

  void insertList(ListCell* L, HashTable& T);

  //==========================================
  //             destroyList
  //==========================================
  // Delete all the cells in linked list L.
  //==========================================

  void destroyList(ListCell* L)
  {
    if(L != NULL)
    {
      destroyList(L->next);
      delete L;
    }
  }

  //==========================================
  //             enlarge
  //==========================================
  // Double the size of the array in hash table
  // T.
  //==========================================

  void enlarge(HashTable& T)
  {
    int       oldSize = T.size;
    int       newSize = 2*oldSize;
    ListCell* oldA    = T.A;

    T = HashTable(newSize);
    for(int i = 0; i < oldSize; i++)
    {
      insertList(oldA[i], T);
      destroyList(oldA[i]);
    }
  }

  //==========================================
  //             insert
  //==========================================
  // Insert key x with associated value v into
  // hash table T.  If x is already a key in
  // T, then just replace its value by v.
  //==========================================

  void insert(string x, string v, HashTable& T)
  {
    if(T.load >= 2*T.size)
    {
       enlarge(T);
    }

    int h = strhash(x.c_str()) % T.size;

    //-----------------------------------------
    // Handle the case where x is already
    // in the table.
    //-----------------------------------------

    for(ListCell* p = T.A[h]; p != NULL; p = p->next)
    {
      if(p->key == x)
      {
         p->value = v;
         return;
      }
    }

    //-----------------------------------------
    // Insert a new cell for new key x.
    //-----------------------------------------

    T.A[h] = new ListCell(x, v, T.A[h]);
  }

  //==========================================
  //             insertList
  //==========================================
  // For each (key, value) pair in linked list
  // L, insert that pair int hash table T.
  //==========================================

  void insertList(ListCell* L, HashTable& T)
  {
    for(ListCell* p = L; p != NULL; p = p->next)
    {
      insert(p->key, p->value, T);
    }
  }