2011-09-10 6 views
3

회귀 트리를 만들고 싶습니다. 트리 생성 후 루트 노드에서 유효한 값을 가져올 수없는 이유는 무엇입니까?루트 노드 값이 유효하지 않은 이유는 무엇입니까?

/* 
* File: main.c 
* Author: C-AP 
* 
* Created on September 9, 2011, 8:06 PM 
*/ 
#include <stdio.h> 
#include <stdlib.h> 

typedef struct regnode { 
    int setsize; 
    int* set; 
    int tokenpos; 
    int nextsize; 
    struct regnode** next; 
} regnode; 

/* 
* print array 
*/ 
void printliniar2(int dim, int* mat, char* label) { 
    int i; 
    printf("\n%s\n", label); 
    for (i = 0; i < dim; i++) 
     printf(" %d ,", mat[i]); 
    printf("\n"); 
} 

/* 
* copies array source to array destination 
*/ 
void copyToInt(int dim, int* Source, int* Destination) { 
    int i; 
    for (i = 0; i < dim; i++) 
     Destination[i] = Source[i]; 
} 

void getReducedSet(int dim, int* set, int delpos, int* newset){ 
    int i,j=0; 
    for(i=0;i<delpos;i++,j++) 
     newset[j] = set[i]; 
    for(i=delpos+1;i<dim;i++,j++) 
     newset[j] = set[i]; 

} 

void genTree(int setsize, int* set, int tokenpos, regnode* node){ 

    printf("\n**********************************\n"); 

    //allocate memory for node variable 
    node = (regnode*)malloc(sizeof(regnode)); 

    //insert set dimension 
    node->setsize = setsize; 
    printf("node setsize : %d",node->setsize); 

    //allocate set space 
    node->set = calloc(node->setsize,sizeof(int)); 

    //insert set into node  
    copyToInt(setsize,set,node->set); 
    printliniar2(node->setsize,node->set,"node set (copy)"); 

    //insert token position 
    node->tokenpos = tokenpos; 
    printf("\nnode tokenpos : %d\n",node->tokenpos); 

    //insert number of next nodes 
    node->nextsize = setsize - 1 - tokenpos; 
    printf("\nnode nextsize : %d\n",node->nextsize); 

    //allocate memory for next nodes 
    node->next = malloc(node->nextsize*sizeof(regnode*)); 

    //create children nodes 
    int i; 
    for(i=0;i<node->nextsize;i++){ 
     //create next node 
     regnode* next; 

     //get reduced set for child node 
     int* newset = calloc(setsize-1,sizeof(int)); 
     getReducedSet(setsize,set,tokenpos+i,newset); 

     //keep reference to next node 
     node->next[i] = next; 

     //recursively call genTree 
     genTree(setsize-1,newset,tokenpos+i,next); 
    } 
} 

/* 
    void exploreTree(regnode* root){ 
    printf("\n**********************************\n"); 
    printf("\nnode setsize : %d\n",root->setsize); 
    printliniar2(root->setsize,root->set,"set"); 
    printf("\nNumber of next nodes : %d\n",root->nextsize); 
    int i; 
    for(i=0;i<root->nextsize;i++) 
    exploreTree(root->next[i]); 
    } 
    */ 

/* 
* 
*/ 
int main(int argc, char** argv) { 
    int dim = 5; 
    int set[] = {1,2,3,4,5}; 
    int tokenpos=0; 
    regnode* root; 

    genTree(dim,set,tokenpos,root); 
    //exploreTree(root); 

    printf("\nSet dimension : %d\n",root->setsize); 
    printliniar2(root->setsize,root->set,"set"); 
    printf("\nNumber of next nodes : %d\n",root->nextsize); 

    return (EXIT_SUCCESS); 
} 
+0

줄이거 나 들여 쓰기를 수정하거나 주석 처리 된 코드를 제거 할 수 있습니까? 코드를 읽기 쉽게 만들면 사람이 읽을 가능성이 높아집니다. –

+0

@cfort 질문을 수정하여 수정 된 코드 만 갖도록하십시오. 문제를 해결 한 yi_H의 대답을 수락하십시오. [faq]를 읽으십시오. –

답변

2

root은 값으로 전달되고 genTree는 생성 된 노드를 반환하지 않습니다.

관련 문제