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

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

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

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

2610閲覧

二分探索木の高さを求める

grape_ll

総合スコア83

C

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/10/03 07:18

C言語で木の高さ,内部道長,外部道長を求めるプログラムを考えています.
高さを再帰関数を用いて求めようとしたのですが,関数を呼ぶ際に何を引数にすればいいのかわからなくなってしまいました.
一つ目のコードの一番下にある,STheightで木の高さを求めています.
二つ目のコードの下でheightを宣言してここに返り値を入れたいのですが,今のままでコンパイルすると
implicit declaration of function 'STheight'
となってしまいます.
どのようにすれば解決しますでしょうか.

C

1#include <stdlib.h> 2#include<stdio.h> 3#include<time.h> 4#include "Item.h" 5//clock_t start,end; 6typedef struct STnode* link; 7struct STnode { Item item; link l, r; int N; }; 8static link head, z; 9link NEW(Item item, link l, link r, int N) 10{ link x = malloc(sizeof *x); 11 x->item = item; x->l = l; x->r = r; x->N = N; 12 return x; 13} 14void STinit(){ 15 //start=clock(); 16 head = (z = NEW(NULLitem, 0, 0, 0)); 17} 18int STcount(void) { return head->N; } 19Item searchR(link h, Key v) 20{ Key t = key(h->item); 21 if (h == z) return NULLitem; 22 if eq(v, t) return h->item; 23 if less(v, t) return searchR(h->l, v); 24 else return searchR(h->r, v); 25} 26Item STsearch(Key v) { return searchR(head, v); } 27link insertR(link h, Item item) 28{ Key v = key(item), t = key(h->item); 29 if (h == z) return NEW(item, z, z, 1); 30 if less(v, t) 31 h->l = insertR(h->l, item); 32 else h->r = insertR(h->r, item); 33 (h->N)++; return h; 34} 35void STinsert(Item item) 36{ head = insertR(head, item); } 37void sortR(link h, void (*visit)(Item)) 38{ 39 if (h == z) return; 40 sortR(h->l, visit); 41 visit(h->item); 42 sortR(h->r, visit); 43} 44void STsort(void (*visit)(Item)) 45{ //end=clock(); 46 //printf("%fsec\n",(double)(end-start)/CLOCKS_PER_SEC); 47 sortR(head, visit); 48} 49 50int Max(int x,int y){ 51 if(x < y) return y; 52 else return x; 53} 54 55int STheight(link h){ 56 if(h == NULL) return 0; 57 else return 1 + Max(STheight(h->l),STheight(h->r)); 58} 59

C

1#include <stdio.h> 2#include <stdlib.h> 3#include "Item.h" 4#include "ST.h" 5 6int main(int argc, char *argv[]) 7{ int N, M, maxN = atoi(argv[1]), sw = atoi(argv[2]); 8 Key v; Item item; 9 STinit(maxN); srand(1); 10 for (M = 0, N = 0; N < maxN; N++) 11 { 12 if (sw == 1) v = ITEMrand(); 13 else if (sw == 2) v = N+1; 14 else if (ITEMscan(&v) == EOF) break; 15 item = STsearch(v); if (item.key != NULLitem.key) continue; 16 key(item) = v; 17 STinsert(item); M++; 18 } 19 STsort(ITEMshow); 20 printf("\n"); 21 printf("%d keys ", N); 22 printf("%d distinct keys\n", STcount()); 23 24 int height = STheight(item); 25 printf("height:%d\n",height); 26 27 return 0; 28} 29

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

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

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

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

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

maai

2020/10/03 08:59

> 二つ目のコードの下でheightを宣言してここに返り値を入れたいのですが,今のままでコンパイルすると > implicit declaration of function 'STheight' > となってしまいます. これが解決したい質問でしょうか?(二分探索木は関係ない?) でしたら、int height = STheight(item);辺りがおかしいのですが、 Item.hの型定義の情報があれば、より詳しく回答できると思います。 エラーログも1行だけでなく、行番号も出てくるはずなので、もう少し情報がほしいところです
guest

回答2

0

ベストアンサー

エラーについては情報が少ないので直接的な回答はできませんが、STheightについては他の関数と合わせるなら別の関数を用意してそれを呼び出す形にすべきでしょう。

C

1int STheight() { 2 return heightR(head); 3} 4int heightR(link h){ 5 if(h == NULL) return 0; 6 else return 1 + Max(heightR(h->l),heightR(h->r)); 7}

投稿2020/10/03 10:25

yudedako67

総合スコア2047

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

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

0

C言語 二分探索木の高さ、内部道長
過去に同じような質問で回答も複数されています。
参考になれば...

投稿2020/10/03 08:41

kuma_kuma_

総合スコア2506

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問