基礎的な質問で申し訳ありませんが皆さんのお力をお借りしたいです
学校の授業で以下のようなコードを組みました
(2分探索木についてのコードですが、内容そのものは質問とは
関係ありません)
c
1 2#include<stdio.h> 3#include<stdlib.h> 4 5typedef struct bst_node{ 6 int value; 7 struct bst_node *left; 8 struct bst_node *right; 9} NODE; 10 11NODE *root; 12 13 14NODE *create_node(int d){ 15 NODE *p; 16 17 p=malloc(sizeof(NODE)); 18 p->value=d; 19 20 return p; 21} 22 23void insert_bst(int d){ 24 NODE *p; 25 26 if(root==NULL){ 27 root=create_node(d); 28 return; 29 } 30 31 p=root; 32 while(1){ 33 if(p->value==d)return ; 34 35 if(p->value>d){ 36 if(p->left==NULL){ 37 p->left=create_node(d); 38 return; 39 }else{ 40 p=p->left; 41 } 42 }else { 43 if(p->right==NULL){ 44 p->right=create_node(d); 45 return; 46 }else{ 47 p=p->right; 48 } 49 } 50 } 51} 52 53 54 55void preorder(NODE *node){ 56 if(node==NULL) return; 57 printf("%d->",node->value); 58 preorder(node->left); 59 preorder(node->right); 60} 61 62void inorder(NODE *node){ 63 if(node==NULL)return; 64 preorder(node->left); 65 printf("%d->",node->value); 66 preorder(node->right); 67 68} 69void pastorder(NODE *node){ 70 71 if(node==NULL)return; 72 pastorder(node->left); 73 pastorder(node->right); 74 printf("%d->",node->value); 75} 76 77int max_bst(){ 78 if(root==NULL){ 79 return -1; 80 } 81 NODE *p=malloc(sizeof(NODE)); 82 NODE *p=root; 83 while(p->right!=NULL){ 84 p=p->right; 85 } 86 87 return p->value; 88} 89 90 91int main(){ 92 int i; 93 int a[7]={17,24,4,9,11,2,23}; 94 95 for(i=0;i<7;i++){ 96 insert_bst(a[i]); 97 } 98 99 printf("preorder"); 100 preorder(root); 101 printf("\ninorder"); 102 inorder(root); 103 printf("\npastorder"); 104 pastorder(root); 105 106 printf("\n Max value of BST is %d\n",max_bst()); 107} 108 109
ここで気になったのはところどころで、構造体のポインタを宣言したあとに、領域を動的に
確保していることです
(例えばcreate_node関数内におけるポインタp)
今までの私のイメージでは、動的確保は例えば配列の要素数分の領域を跡付けで定義するように
前もってわかっていない大きさの領域を後から確保する場合に使うものでした
ところが今回の場合、(私のイメージでは)確保する領域は構造体1つ分で前もってわかって
いるように思えます
このような場合に動的確保を行わなければいけないのはなぜでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。