2016-04-08 7 views
0

Für eine Zuweisung muss ich Code schreiben, der eine Zeichenfolge als Eingabe akzeptiert und zählt, welches Wort in dieser Zeichenfolge am häufigsten verwendet wird.Das Speichern von Objekten in BinarySearchTree führt zu seltsamen Dereferenzierungsproblemen.

Wir müssen dies mithilfe eines binären Suchbaums einer Struktur namens "WordCount" implementieren, der ein Zeichenarray und die Anzahl der Male enthält, wie oft das Wort angezeigt wird.

So wird die Struktur definiert.

struct wordcount { 
    char word[80]; 
    int count; 
}; 

typedef struct wordcount WordCount; 

Ein binärer Suchbaum einen Weg Knoten erstellen muß, das ist der Code:

BSTnode* createNode(void* item) { 
    BSTnode* newNode = (BSTnode*) malloc(sizeof(BSTnode)); 

    newNode->item = item; 
    newNode->left = NULL; 
    newNode->right = NULL; 

    return newNode; 
} 

Wenn ich speichere Sie die Wordcount Struktur des Binary Search Baum innerhalb von und versuchen, das Objekt zuzugreifen, und dann auf das Wort zugreifen, bekomme ich einen Segmentierungsfehler.

Wenn ich nur versuche, auf das Element des Baumes zuzugreifen, bekomme ich die Char-Wort-Array. Das macht keinen Sinn, weil ich die wordCount-Struktur speichere, also sollte ich es zweimal dereferenzieren müssen.

int main(int argc, char* argv[]) { 
    if (argc >= 1) { 
     WordCount* firstWord = (WordCount*) malloc(sizeof(WordCount)); 
     strcpy(firstWord->word,argv[1]); 
     firstWord->count = 0; 
     BSTnode* BST = createNode(firstWord); 
     printf("%s", BST->item); // should be BST->item->word...but this does not work and says that it cannot find "word" which is apart of 
    } 
    /*int i; 
    char string[80]; 
    for(i = 1; i < argc; i++) { 
     sscanf(argv[i], "%s", string); 
     //printf("%s ", string); 
     //insert(main, argv[i], wordCountCompare); 
    }*/ 
} 

Jede Hilfe wird sehr geschätzt. Lassen Sie mich wissen, ob meine Erklärung völlig vage oder unvollständig ist oder ob ich etwas völlig übersehen habe.

Ich möchte auch klarstellen, dass die printf-Anweisungen nur zum Debuggen sind, nur werden sie nicht Teil des eigentlichen Programms sein ... aber der Punkt steht immer noch.

Definition von BSTnode:

struct bstnode { 
    void *item; 
    struct bstnode *left; 
    struct bstnode *right; 
}; 
typedef struct bstnode BSTnode; 
+0

Ist sollte 'printf sein ("% s", BST-> item.word)'. –

+1

'Element' ist ein Zeiger. Sollte es nicht "BST-> Gegenstand-> Wort" sein? –

+0

sagt, dass Wort ist nicht getrennt von der Struktur oder Union, wieder was ist seltsam, so frage ich mich, was ich falsch mache. – Chris

Antwort

1

Ihr Artikel von wordcount Typ sein sollte.

struct bstnode { 
    wordcount *item; 
    struct bstnode *left; 
    struct bstnode *right; 
}; 
typedef struct bstnode BSTnode; 

Sie können nicht dereferencing void-Zeiger (die dem Übersetzungsfehler führen) werden

+0

Ich habe die Frage gelöst, nachdem ich gegangen bin, aber das ist die (irgendwie) richtige Antwort. Was ich stattdessen getan habe, war nur Cast ((WordCount *) BST-> Element) -> Wort wie folgt. Auf diese Weise können wir einen bstnode von int oder anderen Typen erstellen. Auf jeden Fall sollte die Warnungen gelesen haben ... – Chris

0

Sie bekommen wahrscheinlich diese Fehler, weil Sie sind versucht, dereferenzieren einen Zeiger auf NULL. Erfahren Sie, wie Sie den Debugger verwenden !. Hinweis: bricht in Haupt- und Schritt durch die Funktion, um zu sehen, wo die Segmentierung Fehler auftreten

+0

Dies ist keine Antwort, sondern ein Kommentar. –

+0

@michere Touché. Nächstes Mal! – mjr

0
printf("%s", BST->item); 

Printf des „% s“ erwartet einen String, und item ist eine Struktur. Versuchen:

printf("%s" BST->item->word); 
Verwandte Themen