2013-10-25 5 views
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); 
} 

Как разорвать этот цикл так, что она печатает дерево в заказовМои.

ответ

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.

+0

Это канонический способ печати дерева по порядку. Если это не сработало, проблема должна быть в другом месте. –

+0

В решении нет петли: вы выполняете рекурсию, а не итерацию (цикл). –

+0

Это может быть в самой структуре данных, но для того, что я могу сказать комментарием по моему ответу, это должно было сработать. –

5

p не изменяется в цикле, что бы сделать его конечным? То, что вы хотели сделать, это, вероятно,

if(!p) return; 

вместо петли while. (Чтобы понять рекурсию, сначала вам нужно понять рекурсию).

+0

OMG! Потрясающие. спасибо .. – Arpit

+0

Обратите внимание, что это именно то, что предложил Стефано, и вы сказали, что он не работает;) –

+1

+1. Я предполагаю, что OP сохранил цикл while и только изменил условие, вместо того, чтобы заменить на 'if'. –

1

Вы представляете собой объединение рекурсии и итерации. В вашей функции printInTree вы используете рекурсию для вызова той же функции на дочерних узлах, однако у вас также есть это внутри цикла while, убедившись, что p != NULL. Для любого заданного вызова функции printInTree, если p == NULL, этот вызов будет бесконечным.

Если вы меняете while на if, ваш код должен работать без бесконечного цикла.

0

p не изменяется к концу цикла while (который, как указывали другие, должен быть инструкцией if)

Смежные вопросы