質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.54%

C言語 木構造 効率の良いプログラムにするには

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 559

hbhvychgh

score 11

始めたての初心者です。
名簿番号と名前を木構造で、左の木が小さな名簿番号になるように収納して、名簿番号順に表示させるプログラムです。本などを参考にしながら自分で作ってみました。

#include "pch.h"
#include <iostream>
#include<stdio.h>
#include<malloc.h>

#define LENGTH 20

struct person *talloc();
int genlist();
void displist(struct person *);

struct person
{
    struct person *right;
    int num;
    char name[LENGTH];
    struct person *left;

};

int main()
{
    genlist();

    displist(head);    

    return 0;
}

int genlist() {

    struct person *n,*old = talloc();
    int again = 0;

        old = n = talloc();
        n->left = n->right = NULL;

        printf("name = ");
        scanf_s("%s", n->name,LENGTH);

        printf("\nnum = ");
        scanf_s("%d", &n->num);
        printf("\n");

        printf("Finish?-> 0 \n");
        scanf_s("%d", &again);
        printf("\n");
        if (again == 0)
            return 0;

    while (n = talloc(),printf("\nname = "),scanf_s("%s",n->name, LENGTH),printf("\nnum = "),scanf_s("%d",&n->num),printf("\n") != EOF)//New data
    {
        //search for prepared location
        while (true)
        {

            if (old->num > n->num && old->left == NULL) {
                old->left = n;
                n->right = n->left = NULL;
                break;
            }
            else if(old->num < n->num && old->right == NULL){
                old->right = n;
                n->right = n->left = NULL;
                break;
            }
            else if (old->num > n->num)
                old = old->left;            
            else if (old->num < n->num)            
                old = old->right;            
            else
                printf("something wrong\n");

        }

        printf("Finish?-> 0 \n");
        scanf_s("%d", &again);
        printf("\n");
        if (again == 0)
            return 0;

    }

    return 0;
}

void displist(struct person *root) {//再帰を使って表示
    if (root != NULL) {
        displist(root->left);
        printf("%d : %s\n", root->num, root->name);
        displist(root->right);
    }
}


struct person *talloc() {
    return (struct person *)malloc(sizeof(struct person));
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mather

    2018/11/04 12:43

    質問を書きましょう。

    キャンセル

  • raccy

    2018/11/04 13:10 編集

    えと、このコードについて、今何が問題で、何を解決したいのでしょうか?タイトルにある「効率」の一言でも、速度をあげる、メモリ使用量を減らす、コードを読みやすくする、汎用性を高める、と言った複数の要素があり、それによって具体的にどのような方法があるのかは全く異なる場合があります。効率化したい部分の対象によっては、Cではない他の言語を採用すると言うことも考慮する必要があり、このままでは「より効率よく素早くコーディングしたいなら、CではなくてPythonやRubyを使った方がいい」という回答もあり得てしまいます。より具体的になにをどうしたいのかの要件を書いてください。

    キャンセル

  • cateye

    2018/11/04 15:20 編集

    質問とは関係ないですが、amazonのロゴはやばいでしょう・・・訴えられますよ^^;

    キャンセル

回答 1

+1

効率が良いかどうかは別にして、気づいた事。

  1. old の変数が初期化されていますが、その中身まで初期化されていないにも関わらず、参照されています。  (old->num, old->left 等)

  2. 最初のwhile(n = talloc(), ..)  この括弧内の条件式ですが、最後に EOFと比較していますが、何と比較しているのでしようか?
    printf("\n") の結果と比較? でしょうか。
    また、この沢山の式、()内に入れる必要があるかどうか? 上に同じ事している箇所があるので、、と思ったが、良く見ると while()の前の n の中身は使われていませんね。

  3. #include <iostream> がありますが、これは C++用では?
    コンパイル通りますか?

と、効率以前に正しく動作するのでしょうか?
 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る