2017-02-09 11 views
1

Я реализую программу для поиска строки в файле. Что я делаю, я прошу пользователя ввести имя и содержимое файла, а затем символизировать содержимое с пространством как разделитель и создать хеш-таблицу. пример:Удалить из HashTable на основе значения в C++, не используя STL

filename-abc.txt content- i am bad than u filename-xyz.txt content-u r awesome.

Моя хэш-карта выглядит следующим образом:

i->abc.txt 
m->abc.txt 
bad->abc.txt 
than->abc.txt 
u->abc.txt->xyz.txt 
r->xyz.txt 
awesome->xyz.txt 

я должен сделать много работы на нем, но одна такая операция delete the filename, что означает, что если пользователь запрашивает удалить xyz.txt, то HashMap должен выглядеть

i->abc.txt 
m->abc.txt 
bad->abc.txt 
than->abc.txt 
u->abc.txt 

Все это происходит в памяти, и я создал мой собственный hashnode и hashmap, не используя C++ STL.

Мой HashNode выглядит следующим образом

class HashNode 

    { 

     public: 

     int key; 

     string value; 

     HashNode* next; 

      HashNode(int key, string value) 

      { 

      this->key = key; 

      this->value = value; 

      this->next = NULL; 

      } 

    }; 

HashMap, как это

class HashMap 

    { 

     private: 

      HashNode** htable; 

     public: 

      HashMap() 

      { 

       htable = new HashNode*[TABLE_SIZE]; 

       for (int i = 0; i < TABLE_SIZE; i++) 

        htable[i] = NULL; 

      } 

Как бы я осуществить операцию удаления файла.

+0

В соответствии с вашим кодом удаление 'filename' является просто задачей удаления узла из отдельного списка ссылок. Но вам нужно разобрать список ссылок, который присутствует в каждом индексе вашей хеш-таблицы. Вместо разбора всей хэш-таблицы вы можете создать вторую hastable, которая может сообщить вам, какой файл присутствует, по индексу первой хеш-таблицы. – sameerkn

ответ

0

Вы можете создать trie для каждого файла. Таким образом, как только файл будет помечен для удаления, выполните синтаксический анализ через trie и для каждого слова в trie, удалите соответствующий ключ из Hash Map. И затем удалите trie. Или иначе, для каждого файла вы можете создать дополнительный Hashmap с ключом как строку и значение как 1, чтобы пометить его как присутствующий. И как только файл будет помечен для удаления, выполните итерацию через файл Hashmap, а для каждого ключа удалите соответствующую запись в файле hashmap строки -> file. Trie one займет меньше памяти и, вероятно, быстрее, чем hasmap.