2017-11-21 5 views
0

Also, ich habe TRIE DS zu implementieren, und während der Knoten in der Struktur den Wert der Wörter nach AddWord endet zugewiesen, aber wenn ich den Baum durchqueren, Der Wert, der Drucke ist Null. Was habe ich falsch gemacht, unfähig darauf hinzuweisen? Bitte kann jemand helfen.TRIE DS Implementierung versucht

#include<iostream> 
    #include<string> 

    using namespace std; 

    struct trie{ 
     int words; 
     int prefixes; 
     trie* edges[26]; 
    }; 

    void addWord(trie* vertex, string word){ 

     if(word.length() == 0){ 
      vertex->words = vertex->words + 1; 
     } 
     else{ 
      // cout<<word<<endl; 
      vertex->prefixes = vertex->prefixes + 1; 
      char k = word[0]; 
      if(vertex->edges[k - 'a'] == NULL){ 
       trie *n = (trie*)malloc(sizeof(trie)); 
       n->words = 0; 
       n->prefixes = 0; 
       for(int i=0;i<26;i++) 
        vertex->edges[i] = NULL; 
       vertex->edges[k - 'a'] = n; 
      } 
      word.erase(0, 1); 
      addWord(vertex->edges[k - 'a'], word); 
     } 
    }; 
    void traverse(trie *vertex){ 
     if(vertex != NULL){ 
      for(int i=0;i<26;i++){ 
       if(vertex->edges[i] != NULL){ 
        traverse(vertex->edges[i]); 
        cout<<char(i+'a')<<" - "<<vertex->prefixes<< " : "<<vertex->words<<endl; 
       } 
      } 
     } 

    }; 


    int main(){ 
     string word = "hello"; 
     trie* head = (trie*)malloc(sizeof(trie)); 
     for(int i=0;i<26;i++) 
      head->edges[i] = NULL; 
     head->words = 0; 
     head->prefixes = 0; 
     addWord(head, word); 
     string s = "lo"; 
     traverse(head); 
     return 0; 
    } 
+0

Haben Sie Einzelschritten den Code in Ihrem Debugger, um zu sehen, wo es Spur abgehend wird? Wenn nicht, dann würde ich sagen, dass Sie das falsch gemacht haben. –

+0

@JimMischel, irgendeinen besonderen Vorschlag pls, speziell für einfache Ein-Datei-C/C++? –

+1

Vorschlag für was? Mein spezieller Vorschlag ist, dass Sie Ihren Debugger starten und den Code in einem Schritt ausführen, damit Sie sehen können, wo er nicht das tut, was Sie erwarten. Wenn Sie nicht wissen, wie Sie den Debugger verwenden, ist jetzt die perfekte Zeit zum Lernen. –

Antwort

1

Es gibt zwei Probleme mit Code:

  1. In Ihrer addWord Funktion innerhalb else Block, in der for Schleife ändern vertex->edges[i] = NULL;-n->edges[i] = NULL;
  2. Das Problem Sie ist gefragt in Ihrem traverse Funktion. Sie drucken nicht die words Zählung für den Knoten, auf den zuletzt von say last o gezeigt wird, Sie drucken es für den Knoten, der o hat, wie es Kante ist. So einfach dies ändern:

    cout<<char(i+'a')<<" - "<<vertex->prefixes<< " : "<<vertex->words<<endl;

dazu:

cout<<char(i+'a')<<" - "<<vertex->edges[i]->prefixes<< " : "<<vertex->edges[i]->words<<endl;