0

这是我的代码,除了无限循环之外,它几乎是正确的printInTree()

struct node{
    char text[100];
    int count;
    struct node* left;
    struct node* right;
};

struct node* addNode(struct node* n,char w[]){
    int cond=0;
    if(n == NULL){
        n=malloc(sizeof(struct node));
        n->count=1;
        n->left=NULL;
        n->right=NULL;
        strcpy(n->text,w);
    }
    else if((cond=strcmp(w,n->text))==0){
        n->count++;
    }
    else if(cond>0){
        n->right=addNode(n->right,w);
    }
    else{
        n->left=addNode(n->left,w);
    }
    return n;
};

void printInTree(struct node* p){   
    while(p != NULL){                //infinite loop here.
        printInTree(p->left);
        printf("%3s - %d\n",p->text,p->count);
        printInTree(p->right);

    }
}

void b_treeDemo(){
    struct node *root=NULL;
    FILE* f=fopen("main.c","r");
    char word[100];
    while(1){
        if(getWord(f,word)>0){
            if(isalpha(word[0])){
                root=addNode(root,word);
            }
        }else{
            break;
        }
    }
    printInTree(root);
}

如何打破这个循环,以便它按顺序打印树。

4

4 回答 4

5

p在循环中没有改变,什么会使它变得有限?你想做的可能是

if(!p) return;

而不是while循环。(要先了解递归,您需要了解递归)。

于 2013-10-25T19:41:04.527 回答
2

您正在尝试递归打印一棵树,所以这就是您想要的:

void printInTree(struct node* p){   
    if (p == NULL) return;
    printInTree(p->left);
    printf("%3s - %d\n",p->text,p->count);
    printInTree(p->right);
}

当您遇到 NULL 孩子时,递归调用将停止。你不需要while这里。

于 2013-10-25T19:42:30.437 回答
1

您似乎正在结合递归和迭代。在您的printInTree函数中,您使用递归在子节点上调用相同的函数,但是,您也有这个while循环内部,确保p != NULL. 对于函数的任何给定调用printInTree,除非p == NULL,该调用将是无限的。

如果您将 更改whileif,您的代码应该在没有无限循环的情况下运行。

于 2013-10-25T19:43:28.133 回答
0

p 在 while 循环结束时不会改变(正如其他人指出的那样,应该是 if 语句)

于 2013-10-25T19:45:57.110 回答