2011-03-01 5 views
0

아래의 프로그램은 제대로 컴파일되지만 실행하면 ".exe 파일이 작동을 멈췄습니다"라는 오류 메시지가 나타납니다. 도와주세요. 어떤 제안?".exe 파일이 작동을 멈췄습니다."

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

#define MAXSIZE 500 

struct key 
{ 
    int item; 
    struct key *left; 
    struct key *right; 
}; 

typedef struct key star; 

void make_tree(star *link, int j, char a[]); 
int find_num_of_leaves(star *node); 

star *tree; 
char input[MAXSIZE]; 

int main() 
{ 
    int i=0; 
    int num; 

    printf("Enter the number:\n"); 
    scanf("%[^\n]", input); 

    tree = (star *) malloc(sizeof(star)); 
    tree->item = -1; 

    make_tree(tree, i, input); 
    printf("@@@@@@@"); 
    num = find_num_of_leaves(tree); 
    printf("#######"); 
    printf("\n\n%d", num); 

    return(0); 

} 

void make_tree(star *link, int j, char a[]) 
{ 
    if(a[j] == '\0') 
    { 
     link->left = NULL; 
     link->right = NULL; 
     return; 
    } 

    if(a[j+1] == '\0') 
    { 
     link->right = NULL; 
     return; 
    } 

    if(int(a[j]) > 0) 
    { 
     link->left = (star *) malloc(sizeof(star)); 
     (link->left)->item = a[j]; 
     return make_tree(link->left, j+1, a); 
    } 

    if(((10*int(a[j])) + int(a[j+1])) <= 26) 
    { 
     link->right = (star *) malloc(sizeof(star)); 
     (link->right)->item = (10*int(a[j])) + int(a[j+1]); 
     return make_tree(link->right, j+1, a); 
    } 

} 

int find_num_of_leaves(star *node) 
{ 
    if(node == NULL) 
     return 0;  
    if(node->left == NULL && node->right == NULL) 
     return 1; 
    else 
     return find_num_of_leaves(node->left) + find_num_of_leaves(node->right); 
    /*if(node->left == NULL) 
     find_num_of_leaves(node->right); 

    if(node->right == NULL) 
     find_num_of_leaves(node->left); 

    if(node->right != NULL && node->left != NULL) 
    { 
     find_num_of_leaves(node->left); 
     find_num_of_leaves(node->right); 
    }*/ 

} 
+3

아직 디버깅 해 보셨습니까? –

+0

작업을 중지하기 전에 몇 개의 항목을 입력 할 수 있습니까? –

+0

조차도 아니다 .... .... 그것은 입력을 요구한다. 그런 다음 @@@@@@@을 인쇄하면 –

답변

2

코드가이 비트를 통과 경우 링크 -> 왼쪽은 초기화되지 않습니다 트리를 만드는 일 : (예를 들어, 당신이 콘솔에 한 자리를 입력하면)

if(a[j+1] == '\0') 
{ 
     link->right = NULL; 
     return; 
} 

따라서 코드가 find_num_of_leaves을 호출 할 때 find_num_of_leaves을 호출하면 노드의 왼쪽 부분을 역 참조하려고 할 때 충돌합니다.

+0

그래서 내가 어떻게 고칠 수 있습니까 ?? –

+0

일반적으로 find_num_of_leaves에있는 것처럼 NULL 포인터를 테스트하는 경우이 포인터가 NULL로 초기화되도록해야합니다 – Jimmy

관련 문제