二分木のプログラムを以下のように作成したのですが,メモリの開放はFREE_Memory()でちゃんとできているでしょうか.
c
1#include <stdio.h> 2#include<stdlib.h> 3#include<string.h> 4#define N 30 5 6typedef struct node { 7 struct node *left, *right; 8 char label[N]; 9}TREE; 10TREE *root = NULL;//ポインタ初期化 11 12 //ノードの新規作成 13TREE *NewNode(char *str) { 14 TREE *bp; 15 bp = (TREE *)malloc(sizeof(TREE));//メモリ確保 16 bp->left = NULL; 17 bp->right = NULL; 18 strcpy(bp->label, str); //文字列格納 19 return bp; 20} 21/*ツリー組み立て*/ 22TREE *construct_tree(TREE*node, char *str) { 23 int len1 = 0, len2 = 0; //文字列の長さ 24 if (node == NULL) { //受け取ったrootがNULLのとき 25 node = NewNode(str); //新しくノード(root)作成 26 } 27 else { 28 len1 = strlen(node->label);//nodeに格納されている文字列の長さ 29 len2 = strlen(str); //文字列strの長さ 30 if (len2 < len1) { //文字列の長さ比較 31 node->left = construct_tree(node->left, str);//文字列strの方が短いとき左に登録 32 } 33 else { 34 node->right = construct_tree(node->right, str);//文字列strの方が長いとき右に登録 35 } 36 } 37 return node; 38} 39 40/* 部分木の全ての値を出力 */ 41TREE*print_tree(TREE *node, int depth) { 42 if (node == NULL) { 43 return NULL; 44 } 45 print_tree(node->right, depth + 1);//一番右の子から表示していく 46 { int i; for (i = 0; i < depth; ++i) printf(" "); } // depth分の空白 47 printf("%s\n\n", node->label); 48 print_tree(node->left, depth + 1);//左の子表示 49 return node; 50} 51 52 53/*行きがけ順*/ 54void preorder(TREE*p) { 55 if (p == NULL)return; 56 fprintf(stdout, "立ち寄った節:%s\n", p->label); 57 preorder(p->left); 58 preorder(p->right); 59} 60/*通りがけ順*/ 61void inorder(TREE*p) { 62 if (p == NULL)return; 63 inorder(p->left); 64 fprintf(stdout, "立ち寄った節:%s\n", p->label); 65 inorder(p->right); 66} 67/*帰りがけ順*/ 68void postorder(TREE*p) { 69 if (p == NULL)return; 70 postorder(p->left); 71 postorder(p->right); 72 fprintf(stdout, "立ち寄った節:%s\n", p->label); 73} 74 75/*ツリーを表示する関数*/ 76void Print_All() { 77 print_tree(root, 0);//ツリーの先頭と空白の数(深さ)を与える 78 printf("********** OUTPUT (preorder 行きがけ順)!! **********\n"); 79 preorder(root); 80 printf("********** OUTPUT (inorder 通りがけ順)!! **********\n"); 81 inorder(root); 82 printf("********** OUTPUT (postorder 帰りがけ順)!! **********\n"); 83 postorder(root); 84} 85 86TREE *Free_Memory(TREE *p) { 87 if (p == NULL) { 88 return NULL; 89 } 90 Free_Memory(p->right); 91 free(p->right); 92 Free_Memory(p->left); 93 return p; 94} 95 96int main() { 97 FILE*fp; //ファイルポインタ 98 char str[N];//読み込む文字列 99 //ファイルオープン処理 100 if ((fp = fopen("food.txt", "r")) == NULL) { 101 fprintf(stderr, "%s\n", "error: can't read file."); 102 return EXIT_FAILURE; 103 } 104 fscanf(fp, "%s", str); //最初の文字列読み込み 105 root = NewNode(str);//rootを作成,pはrootへのポインタ 106 while (fscanf(fp, "%s", str) != EOF) {//ファイルエンドまで文字列読み込み 107 construct_tree(root, str); //ツリー組み立て 108 } 109 Print_All(); //ツリーを各方法で表示 110 return 0; 111} 112
テストコードちょこっと書けばわかるやん。mallocのたびに+1 / freeのたびに-1 するカウンタを仕込んでおいて、最終的に0になればOK.
回答4件
あなたの回答
tips
プレビュー