2011-12-04 10 views
1

私は単純なプログラムを書いて、その繰り返し時間のために数字を一つずつ並べ替え、それを一つずつツリーに挿入します。私の問題は、私は以下の関数を参照型で呼び出すように変更できなかったので、私はルートの子を挿入できませんでした。C - 参考資料で呼び出す

以下のパラメータは、私が思うにルートのアドレス値を保持する必要があります。

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これはさらに悪いことです。質問にはそれぞれの ' - >'の周りに**スペースが2つあります。 –

+0

初心者にとってはよくある間違いですが、これまでに質問されていますが、問題の明確な陳述が+1されています。あなたはそれを自分で手に入れることに近かったのです。 – dmckee

答えて

2

"if(q == NULL){ }"ブロックに割り当てられたノードが失われました。関数が戻ると、呼び出し側が利用できるポインタはありません。 (qは= P;割り当てが何もしない)

UPDATE:** 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; 

しかし、あなたは唯一の関数に渡されたコピーを変更しているので、これではありません。

​​

あなたは別のレベルを追加する必要があります関数の外部で変更が表示されるように引数自体を変更するために間接参照を使用します。

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 
    } 
} 
関連する問題