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

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

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

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

Q&A

1回答

2746閲覧

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

hbhvychgh

総合スコア13

C

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

0グッド

0クリップ

投稿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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2018/11/04 03:43

質問を書きましょう。
raccy

2018/11/04 04:11 編集

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

2018/11/04 08:57 編集

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

回答1

0

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

  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

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問