0

私のプログラムは、ファイルから文字を読み取り、ファイル内のコンテンツの順序順、順序順、順序順を表示することを想定しています。問題は、ファイルのコンテンツの半分しか表示されないことです。ファイルからの読み取りを停止する場所と理由がわかりませんか?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MaxWordSize 50

typedef struct {
    char word[MaxWordSize + 1];
}NodeData;

typedef struct treeNode {
    NodeData data;
    struct treeNode *left, *right;
}TreeNode, *TreeNodePtr;

typedef struct {
    TreeNodePtr root;
}BinaryTree;

void visit(TreeNodePtr node) {
    printf("%s", node -> data.word);
}//end visit

void preOrder(TreeNodePtr node) {
    void visit(TreeNodePtr);
    if (node != NULL) {
        visit(node);
        preOrder(node -> left);
        preOrder(node -> right);
    }
}

void inOrder(TreeNodePtr node) {
    void visit(TreeNodePtr);
    if (node != NULL) {
        inOrder(node -> left);
        visit(node);
        inOrder(node -> right);
    }
}

void postOrder(TreeNodePtr node) {
    void visit(TreeNodePtr);
    if (node != NULL) {
        postOrder(node -> left);
        postOrder(node -> right);
        visit(node);
    }
}

TreeNodePtr buildTree(FILE *in) {
    char str[MaxWordSize + 1];
    fscanf(in, "%s", str);
    if (strcmp(str, "@") == 0) {
        return NULL;
    }
    TreeNodePtr p = (TreeNodePtr)malloc(sizeof(TreeNode));
    strcpy(p -> data.word, str);
    p -> left = buildTree(in);
    p -> right = buildTree(in);
    return p;
}

int main() {
    TreeNodePtr buildTree(FILE *);
    void preOrder(TreeNodePtr);
    void inOrder(TreeNodePtr);
    void postOrder(TreeNodePtr);
    FILE *in = fopen("./c/btree.in.txt", "r");
    BinaryTree bt;
    bt.root = buildTree(in);
    printf("\n The pre-order traversal is : ");
    preOrder(bt.root);
    printf("\n The in-order traversal is : ");
    inOrder(bt.root);
    printf("\n The post-order traversal is : ");
    postOrder(bt.root);
    printf("\n\n");
    fclose(in);
    system ("PAUSE");
    return 0;
}

私の入力ファイルの内容は次のとおりです。

C E F @ @ H @ @ B @ @ G A @ @ N J @ @ K @ @

私の出力は次のとおりです。

The pre-order traversal is: CEFHB
The in-order traversal is: FEHCB
The post-order traversal is: FHEBC
4

2 に答える 2

1

実際には....私は問題を見ていると思います。コードは完全に実行されているように見えますが、入力ファイルが間違っていると思います。

この input:C E F @ @ H @ @ B @ @ G A @ @ N J @ @ K @ @を指定すると、コードは次のように実行されます。

bt.root = buildTree(in);
    fscanf(in, "%s", str); //finds C
    p -> left = buildTree(in);
        fscanf(in, "%s", str); //finds E
        p -> left = buildTree(in);
            fscanf(in, "%s", str); //finds F
            p -> left = buildTree(in);
                fscanf(in, "%s", str); //finds @
            p -> right = buildTree(in);
                fscanf(in, "%s", str); //finds @
        p -> right = buildTree(in);
            fscanf(in, "%s", str); //finds H
            p -> left = buildTree(in);
                fscanf(in, "%s", str); //finds @
            p -> right = buildTree(in);
                fscanf(in, "%s", str); //finds @
    p -> right = buildTree(in);
        fscanf(in, "%s", str); //finds B
        p -> left = buildTree(in);
            fscanf(in, "%s", str); //finds @
        p -> right = buildTree(in);
            fscanf(in, "%s", str); //finds @

この時点で、すべてのノードに 2 つの子があるため、実行が停止G A @ @ N J @ @ K @ @し、入力バッファーに残りが残ります。
読み込まれたツリーは左側にあります。残りを再解析すると、右側に示すツリーも形成されます。

       C                       G
   E       B               A       N
 F   H   @   @           @   @   J   K
@ @ @ @                         @ @ @ @

どのツリーを読み込むつもりだったのかわかりませんが、入力にルート ノードが含まれていない可能性があります。


buildTreeそうは言っても、遭遇していなくても、ルーチンに少なくとも 1 つのバグがあります。この入力で試してみてください: " A"、それを見つけるでしょう:D

于 2014-07-23T18:27:50.247 に答える
0

buildTree メソッドを確認してください。

ここでは、これらのルールを使用して簡単な文法を実装しています....

Node -> char Node Node
Node -> @

これらのルールで文字列を手動で解析してみてください。それでは、始めに...

Input -> C LeftNode RightNode
  LeftNode -> E LeftNode RightNode
    LeftNode -> F LeftNode RightNode
      LeftNode -> @
      RightNode -> @
    RightNode -> ...

等々。

文法は一種の高度な概念ですが (通常、大学 3 年で教えられます)、buildTree のようなメソッドを理解するために必要なモデルです。

PS、buildTree がどのように機能するかを理解することに加えて、それが実装している文法の定義で実際にコメントする必要があります。それを文書化することで、多くの作業を節約できます。

于 2014-07-23T17:54:29.723 に答える