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 回答