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

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

新規登録して質問してみよう
ただいま回答率
86.12%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

受付中

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

hbhvychgh
hbhvychgh

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1回答

0グッド

0クリップ

2350閲覧

投稿2018/11/04 03:19

編集2018/11/04 03:29

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

C

1#include "pch.h" 2#include <iostream> 3#include<stdio.h> 4#include<malloc.h> 5 6#define LENGTH 20 7 8struct person *talloc(); 9int genlist(); 10void displist(struct person *); 11 12struct person 13{ 14 struct person *right; 15 int num; 16 char name[LENGTH]; 17 struct person *left; 18 19}; 20 21int main() 22{ 23 genlist(); 24 25 displist(head); 26 27 return 0; 28} 29 30int genlist() { 31 32 struct person *n,*old = talloc(); 33 int again = 0; 34 35 old = n = talloc(); 36 n->left = n->right = NULL; 37 38 printf("name = "); 39 scanf_s("%s", n->name,LENGTH); 40 41 printf("\nnum = "); 42 scanf_s("%d", &n->num); 43 printf("\n"); 44 45 printf("Finish?-> 0 \n"); 46 scanf_s("%d", &again); 47 printf("\n"); 48 if (again == 0) 49 return 0; 50 51 while (n = talloc(),printf("\nname = "),scanf_s("%s",n->name, LENGTH),printf("\nnum = "),scanf_s("%d",&n->num),printf("\n") != EOF)//New data 52 { 53 //search for prepared location 54 while (true) 55 { 56 57 if (old->num > n->num && old->left == NULL) { 58 old->left = n; 59 n->right = n->left = NULL; 60 break; 61 } 62 else if(old->num < n->num && old->right == NULL){ 63 old->right = n; 64 n->right = n->left = NULL; 65 break; 66 } 67 else if (old->num > n->num) 68 old = old->left; 69 else if (old->num < n->num) 70 old = old->right; 71 else 72 printf("something wrong\n"); 73 74 } 75 76 printf("Finish?-> 0 \n"); 77 scanf_s("%d", &again); 78 printf("\n"); 79 if (again == 0) 80 return 0; 81 82 } 83 84 return 0; 85} 86 87void displist(struct person *root) {//再帰を使って表示 88 if (root != NULL) { 89 displist(root->left); 90 printf("%d : %s\n", root->num, root->name); 91 displist(root->right); 92 } 93} 94 95 96struct person *talloc() { 97 return (struct person *)malloc(sizeof(struct person)); 98} 99 100

以下のような質問にはグッドを送りましょう

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

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

気になる質問をクリップする

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

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

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

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

適切な質問に修正を依頼しましょう。

mather

2018/11/04 03:43

質問を書きましょう。
raccy

2018/11/04 04:11 編集

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

2018/11/04 08:57 編集

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

回答1

1

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

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

  2. 最初のwhile(n = talloc(), ..) この括弧内の条件式ですが、最後に EOFと比較していますが、何と比較しているのでしようか?

printf("\n") の結果と比較? でしょうか。
また、この沢山の式、()内に入れる必要があるかどうか? 上に同じ事している箇所があるので、、と思ったが、良く見ると while()の前の n の中身は使われていませんね。

  1. #include <iostream> がありますが、これは C++用では?

コンパイル通りますか?

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

投稿2018/11/04 09:33

pepperleaf

総合スコア6379

Zuishin👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。