2017-02-09 22 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 

所有这一切都在内存中发生的事情,我已经创建了自己的hashnodehashmap,不使用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。 或者,对于每个文件,您可以创建一个额外的Hashmap,其中键为字符串,值为1,以将其标记为存在。一旦文件被标记为删除,迭代文件Hashmap,并为每个键删除字符串 - >文件hashmap中的相应条目。 这个trie将占用更少的内存,并且可能会比hasmap更快。