как создать дерево с помощью # define - PullRequest
0 голосов
/ 13 июля 2011

Я хочу создать дерево. Я видел следующий код

#define NODEALLOC(struct treenode*)malloc(sizeof(struct treenode))

    struct treenode{

          int data;
         struct treenode * left;
         strruct treenode *right;

   }
typedef struct treenode *treeptr;
treeptr root;

treeptr create(int d)
 {

treeptr root;
root =NODEALLOC;
root->data=d;
root->left=null;
root->right=null;
 return root;
}

Я не понимаю утверждения #define. Кто-нибудь может мне помочь?

Ответы [ 3 ]

1 голос
/ 13 июля 2011

Во-первых, это неправильно, ему нужно пространство между NODEALLOC и (

Во-вторых, это зло. хорошо подходит для макросов;это не один из них.

Вот как это работает:

Это простая замена строк, поэтому, когда вы видите root=NODEALLOC;, она становится root=(struct treenode*)malloc(sizeof(struct treenode))

malloc(n) выделяет n байтов памяти, sizeof сообщает malloc, насколько большим должен быть n, а (struct treenode*) преобразует возвращенные malloc void* в правильный тип.

1 голос
/ 13 июля 2011

Не используйте это.Используйте функцию, если вы не хотите писать malloc более одного раза.Использование макросов, подобных этому, лучше избегать (это законно, но не считается хорошей практикой).

Если вы не знаете, что такое макросы, в первую очередь, прочитайте .

0 голосов
/ 13 июля 2011

Все просто.Замените NODEALLOC в коде его определением.В вашем случае:

treeptr create(int d)
{
  treeptr root;
  root = (struct treenode*)malloc(sizeof(struct treenode)); // was NODEALLOC;
  root->data=d;
  root->left=null;
  root->right=null;
  return root;
}

Таким образом, это простое распределение.

Однако использование макроса только для этого не очень полезно, оно может даже запутать читателей вашего кода.Обычно макрос должен делать что-то полезное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...