###木構造を作り、間順と後順でたどり画面表示したい
データを実行時にファイルから読み込み、木構造を作り間順と後順でたどりその結果を画面表示するプログラムを作ったのですが一文字しか表示されません。
原因と直し方を教えて欲しいです。
また変数 w に str の値を次々と取り除いた値を代入していきたいです。
さらに可能であればbin_tree関数内で使う変数は
c:文字変数 w:文字列 p:ポインタ変数 str:cで始まる文字列(記号列)
のみでお願いしたいです。
注文が多くすみません。よろしくおねがいします。
発生している問題・エラーメッセージ
% ./a.out < file_prefix infix notation ====> / postifx notation ==> /
###理想の結果
str = * の場合 w = + 15.5 5.2 - 7.1 / 8.2 2 str = + の場合 w = 15.5 5.2 - 7.1 / 8.2 2 str = 15.5 の場合 w = 5.2 - 7.1 / 8.2 2 ------------------------------------------------- % cat file_prefix * + 15.5 5.2 - 7.1 / 8.2 2 % ./a.out < file_prefix infix notation ====> 15.5 + 5.2 * 7.1 - 8.2 / 2 postifx notation ==> 15.5 5.2 + 7.1 8.2 2 / - *
該当のソースコード
c
1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4#include<ctype.h> 5#include<math.h> 6 7struct node{ 8 char oper[10]; 9 struct node *left; 10 struct node *right; 11}; 12typedef struct node node; 13 14node *bin_tree(){ 15 char c; 16 char w[100],str[100]; 17 node *p; 18 19 fgets( w , 20 , stdin); 20 while((c = getchar()) != EOF){ 21 if(c != ' '){ 22 ungetc(c,stdin); 23 scanf("%s" , str); 24 p = (node *)malloc(sizeof(node)); 25 strcpy(p->oper , str); 26 // w = wにstrをの値を取り除いた値を入れたい 27 if(isdigit(c) != 0){ 28 p->left = NULL; 29 p->right = NULL; 30 return p; 31 } 32 else{ 33 p->left = bin_tree(); 34 p->right = bin_tree(); 35 return p; 36 } 37 } 38 } 39 return 0; 40} 41 42void inorder(node *p){ 43 if(p == NULL){ 44 return ; 45 } 46 else{ 47 inorder(p->left); 48 printf("%s" , p->oper); 49 inorder(p->right); 50 } 51} 52 53void postorder(node *p){ 54 if(p == NULL){ 55 return ; 56 } 57 else{ 58 postorder(p->left); 59 postorder(p->right); 60 printf(p->oper); 61 } 62} 63 64int main(void){ 65 node *root = NULL; 66 root = bin_tree(); 67 printf("infix notation ====> "); 68 inorder(root); 69 printf("\n"); 70 71 printf("postifx notation ==> "); 72 postorder(root); 73 printf("\n"); 74 75 return 0; 76} 77
###追記
解決時のコード
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #include<math.h> struct node{ char oper[10]; struct node *left; struct node *right; }; typedef struct node node; node *bin_tree(){ char c; char str[100]; node *p; while((c = getchar()) != EOF){ if(c != ' '){ ungetc(c,stdin); scanf("%s" , str); p = (node *)malloc(sizeof(node)); strcpy(p->oper , str); if(isdigit(c) != 0){ p->left = NULL; p->right = NULL; return p; } else{ p->left = bin_tree(); p->right = bin_tree(); return p; } } } return 0; } void inorder(node *p){ if(p == NULL){ return ; } else{ inorder(p->left); printf("%s " , p->oper); inorder(p->right); } } void postorder(node *p){ if(p == NULL){ return ; } else{ postorder(p->left); postorder(p->right); printf("%s " , p->oper); } } int main(void){ node *root = NULL; root = bin_tree(); printf("infix notation ====> "); inorder(root); printf("\n"); printf("postifx notation ==> "); postorder(root); printf("\n"); return 0; }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/28 08:53