0

私はこのコードを持っており、これは(うまくいけば)単一リンクリストの実装になります。

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

struct NODE{
   int d;
   struct NODE *next;
};

int addNode(int n, struct NODE **root);

int main(){

    struct NODE *root = NULL;
    addNode(3, &root);

    printf("%i\n", root->d);    

    getch();
    return 0;
}

int addNode(int n, struct NODE **root){


   if(*root == NULL){
           *root = malloc(sizeof(struct NODE));
           *root->d = n;
           *root->next = NULL;
           return 0;
   }
}

これを実行すると、addNode関数内に「構造体または共用体ではないもののメンバー'd'の要求」が表示されます。'次の'部分と同じです。代わりに、関数を次のように変更した場合:

int addNode(int n, struct NODE **root){

struct NODE *temp;

if(*root == NULL){
        *root = malloc(sizeof(struct NODE));
        temp = *root;
        temp->d = n;
        temp->next = NULL;
        return 0;
    }
}

それはうまく機能します。私の質問は; なぜ一時を作成する必要があるのですか?私が理解しているように、コードの最初のバージョンでは、ルートへのポインターを渡しているので、「参照渡し」の問題は発生せず、実行に問題はありません...間違いは何ですか?

4

3 に答える 3

3
(*root)->d = n;
(*root)->next = NULL;

その演算子の優先順位の問題。を使用()すると修正されます。

于 2013-02-19T04:39:41.563 に答える
1

演算子の優先順位。

*root->d = n;

として解析されます

*(root->d) = n;

しかし、あなたはしたい

(*root)->d = n;
于 2013-02-19T04:41:44.060 に答える
0

演算子の優先順位の表を参照してください。演算子は(逆参照)演算子->よりも優先順位が高く*、これがエラーの原因です。

* root-> dは、演算子の優先順位により、(* root)-> dではなく*(root-> d)として解釈されます。

于 2013-02-19T04:43:05.617 に答える