2011-12-04 3 views
1

숫자를 하나씩 순차적으로 정렬하는 간단한 프로그램을 작성한 다음 하나씩 트리에 삽입합니다. 내 문제는, 내가 참조 할 수있는 호출 형식으로 아래의 함수를 변경할 수 없기 때문에 루트 자식을 삽입 할 수 없습니다.C - Reference by Call

아래 매개 변수는 루트의 주소 값을 유지해야합니다.

void insertNode(int data, node *q, node *parent){ 
    if(q == NULL){ 
     node *p = createNode(data); 
     p -> parent = parent; 
     p -> key = generateKey(p); 
     int i; 
     for(i = 0;table[i][1] != 0;i++); 
     table[i][1] = p -> data; 
     table[i][0] = p -> key; 
     q = p; 
    } 
    else if(q -> left > q -> right || q -> left == q -> right){ 
     q -> right++; 
     insertNode(data, q -> rightChild, q); 
    } 
    else if(q -> right > q -> left){ 
     q -> left++; 
     insertNode(data, q -> leftChild, q); 
    } 
} 
+8

'->'주위의 공백이 너무 추합니다. – ThiefMaster

+1

@ThiefMaster 이것은 더 나쁩니다. 질문은 각'->'주위에 두 개의 *** 공백이 있습니다. –

+0

초보자에게 흔히있는 실수이며 이전에이 질문에 답을 얻었으나 문제에 대한 평소와는 달리 +1합니다. 너 너무 가까웠다. – dmckee

답변

2

"if (q == NULL) { }"블록에 할당 된 노드가 손실됩니다. 함수가 반환되면 호출자가 사용할 수있는 포인터가 없습니다.

UPDATE (q를 = P 할당은 아무것도하지) 다음 ** p는뿐만 아니라 재귀를 제거 할 수 있습니다 :이 방법에 대해

void insertNode(int data, node **qRef, node *parent){ 
    node *q; 
    int i; 

    for ( ; (q = *qRef) ; parent=q) { 
    if(q->left >= q->right) { 
     q->right++; 
     qRef = &q->rightChild; 
    } 
    else { 
     q->left++; 
     qRef = &q->leftChild; 
    } 
    } 


    *qRef = q = createNode(data); 
    q->parent = parent; 
    q->key = generateKey(q); 

    for(i=0; table[i][1] != 0; i++) {;} 
    table[i][1] = q->data; 
    table[i][0] = q->key; 

} 
7

는 것입니다 당신이 (단지에 어떤 포인터 포인트를 변경하지) 함수에 전달 된 포인터 에게 새로운 가치을 할당해야하는 경우 C.에서 "참조로 전달합니다"같은 건 없다

void insertNode(int data, node **q, node *parent){ 
    /* code */ 
    *q = p; 
} 

당신이 C에서 포인터 (또는 다른 것)을 통과

당신이 포인터의 사본를 전달하는, 즉, 포인터에 대한 포인터를 전달해야합니다. 따라서, 이러한 유형의 변경은 함수의 호출자로 볼 수 있습니다 :

q->someVal = someOtherVal; 

하지만 당신은 단지 함수에 전달 된 복사본을 수정하기 때문에이되지 않습니다 :

q = p; 

을 당신은 다른 수준을 추가 할 필요가 변경이 함수 외부에서 볼 수 있도록 인수 자체를 수정하려면 간접 참조를 사용해야합니다.

0

를?

void insertNode(int data, node **qRef, node *parent){ 
    node *q = *qRef; //<-- changed 
    if(q == NULL){ 
    node *p = createNode(data); 
    p -> parent = parent; 
    p -> key = generateKey(p); 
    int i; 
    for(i = 0;table[i][1] != 0;i++); 
    table[i][1] = p -> data; 
    table[i][0] = p -> key; 
    *qRef = p; //<-- changed 
    } 
    else if(q -> left > q -> right || q -> left == q -> right){ 
     q -> right++; 
     insertNode(data, &(q -> rightChild), q); //<-- changed 
    } 
    else if(q -> right > q -> left){ 
     q -> left++; 
     insertNode(data, &(q -> leftChild), q); //<-- changed 
    } 
}