ツリーのように表示させるには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: ツリーのように表示させるには

Re: ツリーのように表示させるには

#2

by かずま » 4年前

Keikisa さんが書きました:
4年前
ツリーに登録するプログラムは完成しているので後は表示だけです.
print_tree の修正だけで済みますが、
他もちょっといじってみました。
これはあなたの好みの書き方でも構いません。

コード:

#include <stdio.h>   // fopen, fclose, fscanf, printf
#include <stdlib.h>  // malloc
#include <string.h>  // strlen, strcpy

#define N   30
#define FMT "%29s"

typedef struct node {
	struct node *left, *right;
	char label[N];
} TREE;

TREE *NewNode(const char *str)
{
	TREE *bp = (TREE *) malloc(sizeof(TREE));
	bp->left = bp->right = NULL;
	strcpy(bp->label, str);
	return bp;
}

TREE *construct_tree(TREE *node, const char *str)
{
	if (node == NULL)
		node = NewNode(str);
	else if (strlen(str) < strlen(node->label))
		node->left = construct_tree(node->left, str);
	else
		node->right = construct_tree(node->right, str);
	return node;
}

void print_tree(const TREE *node)
{
	static int k = -5;
	if (!node) return;
	k += 5;
	print_tree(node->right);
	printf("%*s%s\n", k, "", node->label);
	print_tree(node->left);
	k -= 5;
}

int main(void)
{
	TREE *root = NULL;
	char str[N];
	FILE *fp = fopen("food.txt", "r");
	if (!fp) return fprintf(stderr, "error: can't read file.\n"), 1;

	while (fscanf(fp, FMT, str) == 1)
		root = construct_tree(root, str);
	fclose(fp);
	print_tree(root);
	return 0;
}
food.txt

コード:

tomato
eggplant
pork
yellowtail
chips
tea
cabbage
hamburger

ツリーのように表示させるには

#1

by Keikisa » 4年前

バイナリツリーのプログラムを作って、ノードをツリー上に表示させたいのですが,規則を見つけ出すことができません.
ツリーに登録するプログラムは完成しているので後は表示だけです.
以下に、ソースコードと現在のソースでの実行画面,実現したい実行画面を示します.

コード:

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30

typedef struct node {
    struct node *left, *right;
    char label[N];
}TREE;
TREE *root = NULL;//ポインタ初期化

TREE *NewNode(char *str) {
    TREE *bp;
    bp = (TREE *)malloc(sizeof(TREE));
    bp->left = NULL;
    bp->right = NULL;
    strcpy(bp->label, str);
    return bp;
}
TREE *construct_tree(TREE*node, char *str) {
    int len1 = 0, len2 = 0;//文字列の長さ
    if (node == NULL) {
        node = NewNode(str);
    }
    else {
        len1 = strlen(node->label);
        len2 = strlen(str);
        if (len2 < len1) {
            node->left = construct_tree(node->left, str);
        }
        else {
            node->right = construct_tree(node->right, str);
        }
    }
    return node;
}
/* 部分木の全ての値を出力 */
TREE*print_tree(TREE *node) {
    if (node == NULL) {
        return NULL;
    }
    print_tree(node->right);
    printf("%s\n", node->label);
    print_tree(node->left);
    return node;
}
int main() {
    FILE*fp;
    char str[N];
    if ((fp = fopen("food.txt", "r")) == NULL) {
        fprintf(stderr, "%s\n", "error: can't read file.");
        return EXIT_FAILURE;
    }
    fscanf(fp, "%s", str);
    root = NewNode(str);
    while (fscanf(fp, "%s", str) != EOF) {
        construct_tree(root, str);
    }
    print_tree(root);
    return 0;
}
現在の実行画面

コード:

yellowtail
hamburger
eggplant
cabbage
tomato
chips
pork
tea
実現したい実行画面

コード:


          yellowtail
               hamburger
     eggplant
          cabbage
tomato
          chips
     pork
          tea

ページトップ