C言語の課題が出来ません助けてください

このエントリーをはてなブックマークに追加
1名無し募集中。。。
ノードの中身を表示しながらトラバースする関数
void preorder(NodePointer node);
void inorder(NodePointer node);
void postorder(NodePointer node);
を再帰を使って書きなさい。

という問題です
2名無し募集中。。。:2009/05/30(土) 23:21:09.65 0
宿題は自分でやれ
31:2009/05/30(土) 23:22:20.91 0
これを使えと指示がありました
#include <stdio.h>
#include <stdlib.h>

struct node {
struct node *right;
char key;
struct node *left;
};
typedef struct node * NodePointer;

void treeinitialize(void);
NodePointer makenode(char c);
void preorder(NodePointer node);
void inorder(NodePointer node);
void postorder(NodePointer node);

NodePointer head, tail;
41:2009/05/30(土) 23:23:43.06 0
続きint main(){
treeinitialize();

/* テスト用の木を作成 */
head->right=makenode('+');
head->right->left=makenode('1');
head->right->right=makenode('*');
head->right->right->left=makenode('2');
head->right->right->right=makenode('3');


/* トラバース */
printf("preorder: ");
preorder(head->right);
printf("\n");

printf("inorder: ");
inorder(head->right);
printf("\n");

printf("postorder: ");
postorder(head->right);
printf("\n");

return 0;
}
51:2009/05/30(土) 23:25:40.65 0
続き
void treeinitialize(void){
head=makenode(-1);
tail=makenode(-1);
head->right=tail;
head->left=tail;
}

/*
* ノードを作成し、そのノードへのポインタを返す。
*/
NodePointer makenode(char c){
NodePointer x;

x=malloc(sizeof(struct node));
x->key=c;
x->right=tail;
x->left=tail;

return x;
}

void preorder(NodePointer node){


}

void inorder(NodePointer node){
}

void postorder(NodePointer node){
}
6名無し募集中。。。:2009/05/30(土) 23:25:55.21 0
自分でやらなきゃためにならないよ
どうせ考えもせず答えだけ聞こうとしてるんだろ
7名無し募集中。。。:2009/05/30(土) 23:26:38.92 0
最近はC#ばっかだからなぁ...
8名無し募集中。。。:2009/05/30(土) 23:27:19.14 0
C言語の単位とったけどゼミや仕事で役立ったこと無いな
SW会社に入った俺の連れは死に掛けてるけど
9名無し募集中。。。:2009/05/30(土) 23:27:59.74 0
>>1
どこまで考えたんだ?
10名無し募集中。。。:2009/05/30(土) 23:28:24.35 0
プログラミング言語は分かるがノードとトラバースの意味がわからないのでゴメンな
11名無し募集中。。。:2009/05/30(土) 23:29:33.83 0
どっかでつまづいたとかじゃなくて、まだ何も作ってないってか
12名無し募集中。。。:2009/05/30(土) 23:29:43.40 0
教えてあげてもいいけどその前に
#include <stdio.h>とか#include <stdlib.h>
って何か教えて
13名無し募集中。。。:2009/05/30(土) 23:30:06.70 0
もしも将来仕事で使うならこういう分かりづらいソースを書かないようにな
14名無し募集中。。。:2009/05/30(土) 23:30:17.37 0
15名無し募集中。。。:2009/05/30(土) 23:30:34.59 O
農奴とトラバサミがどうしたって?
16名無し募集中。。。:2009/05/30(土) 23:31:01.41 0
ノードに返すポインタってマウスポインタの形状とか位置とか?
17名無し募集中。。。:2009/05/30(土) 23:31:10.25 0
void preorder(NodePointer node){
print (node->key);
if (node->right)
preorder (node->right);
if (node->left)
preorder (node->left);
}

void inorder(NodePointer node){
if (node->right)
inorder (node->right);
print (node->key);
if (node->left)
inorder (node->left);
}

void postorder(NodePointer node){
if (node->right)
postorder (node->right);
if (node->left)
postorder (node->left);
print (node->key);
}

こんな感じと予想
適当
181:2009/05/30(土) 23:31:30.56 0
教えてgooで去年同じ質問してた人がいたんで回答者の言ってること読んだんですけど
よく分からなかったですね
19名無し募集中。。。:2009/05/30(土) 23:31:32.57 0
トラバースってどういう意味?
20名無し募集中。。。:2009/05/30(土) 23:32:01.58 0
そのまま>>17を書いて提出する>>1だった
21名無し募集中。。。:2009/05/30(土) 23:32:15.38 0
('+'); ('1'); ('*'); ('2'); ('3');
父  母  兄  俺  妹
22名無し募集中。。。:2009/05/30(土) 23:32:20.58 0
今の時代JavaC#とPerlだけでいいよ
23名無し募集中。。。:2009/05/30(土) 23:32:42.76 0
トラバースとか言ってる時点で課題ができないわけがない
241:2009/05/30(土) 23:32:52.93 0
>>14
はい木構造もではギリギリ分かったのですが
それを作れと言われるとできないです
25名無し募集中。。。:2009/05/30(土) 23:33:12.41 0
それは分かったといえるのか
26名無し募集中。。。:2009/05/30(土) 23:33:19.40 0
JAVA楽だったんだけど
Cのポインタは苦手だった
短いプログラムならわかるんだけど
27名無し募集中。。。:2009/05/30(土) 23:33:31.16 0
助けてくださいじゃなくて答え教えてくださいだろ
28名無し募集中。。。:2009/05/30(土) 23:33:52.84 0
VB派の俺が来たけどmay i help you?
29名無し募集中。。。:2009/05/30(土) 23:34:12.94 0
まずおっぱいうpしろ
30名無し募集中。。。:2009/05/30(土) 23:34:34.54 0
再帰は理解してるの?
311:2009/05/30(土) 23:35:22.12 0
再起は先週やって少し理解できました
32名無し募集中。。。:2009/05/30(土) 23:35:39.58 0
雰囲気はわかるな
ディテールを考える気力はないけど
33名無し募集中。。。:2009/05/30(土) 23:35:52.33 O
妹キャワ
34名無し募集中。。。:2009/05/30(土) 23:36:03.90 0
作れないのは分かったとは言いませんよ
35名無し募集中。。。:2009/05/30(土) 23:36:06.97 0
自分で考えろよ
36名無し募集中。。。:2009/05/30(土) 23:36:14.16 0
再起じゃねえし
37名無し募集中。。。:2009/05/30(土) 23:37:15.83 0
>>21
wwwwwwwwwwwwww
38名無し募集中。。。:2009/05/30(土) 23:37:35.39 0
さっぱりわからへんわ
39名無し募集中。。。:2009/05/30(土) 23:37:37.82 0
プログラム板で聞いてこいよ
40名無し募集中。。。:2009/05/30(土) 23:37:42.85 0
トラバースの意味が分かんないから3つの関数の仕様を教えてくれよ
41名無し募集中。。。:2009/05/30(土) 23:37:50.07 0
プログラム書く仕事したいけど大変か?
42名無し募集中。。。:2009/05/30(土) 23:38:06.10 0
traverse
【他動】〜を越える、横切る、旋回する、横に歩く、横断する、〜を行き来する、妨害する、〜に矛盾する、〜に反対する、〜に浸透する、詳しく検討する

オレも意味が分からん
431:2009/05/30(土) 23:39:18.62 0
実行結果はこうなるそうです
./a.out
preorder: + 1 * 2 3
inorder: 1 + 2 * 3
postorder: 1 2 3 * +
44名無し募集中。。。:2009/05/30(土) 23:40:16.12 0
ノードってなに?俺の世界じゃ節点のことなんだけど
45名無し募集中。。。:2009/05/30(土) 23:40:26.97 0
>>1
C/C++の宿題片付けます 126代目
http://pc12.2ch.net/test/read.cgi/tech/1242655611/
46名無し募集中。。。:2009/05/30(土) 23:41:17.20 0
トラバースってこれだな
http://www.brpreiss.com/books/opus4/html/page257.html
471:2009/05/30(土) 23:41:45.71 0
節点でいいです
481:2009/05/30(土) 23:43:18.04 0
トラバースはpreorder、inorder、postorder の結果はそれぞれ、
前置記法、(括弧のない)中置記法、後置記法で表示してねって事かな?
49名無し募集中。。。:2009/05/30(土) 23:43:43.94 0
treeinitialize時に未初期化のポインタを使っちゃうのは気持ち悪いなぁ
50名無し募集中。。。:2009/05/30(土) 23:44:16.04 0
>>17 でだいたい合ってんじゃないの?
末端の判定を NULL Pointer じゃなくて tail と比べるんだろけど
511:2009/05/30(土) 23:45:15.55 0
>>45
ごめんなさい
ほかの板は嫌です
52名無し募集中。。。:2009/05/30(土) 23:47:00.63 0
なんかめんどくさそうな課題やってるな
53名無し募集中。。。:2009/05/30(土) 23:47:54.58 0
友達に聞けばいいじゃん
54名無し募集中。。。:2009/05/30(土) 23:48:07.28 0
COBOLしかできないから再帰とかワカンネ
バブルソート最高
55名無し募集中。。。:2009/05/30(土) 23:48:23.66 0
こんな課題役にたつか?
561:2009/05/30(土) 23:49:46.67 0
友達って何
57名無し募集中。。。:2009/05/30(土) 23:50:57.82 0
>>55
2進木をたぐるよーな処理をするとき役にたつぞ
58名無し募集中。。。:2009/05/30(土) 23:55:39.79 0
ちまちましたことにこだわらずに高性能PCをいかしたエレガントな富豪プログラムをしようぜ
59名無し募集中。。。:2009/05/30(土) 23:56:22.82 0
>>57
そういう時ってあるの?
60名無し募集中。。。:2009/05/30(土) 23:58:20.31 0
再帰はトラブルの元だから使わないのが大人のやり方
611:2009/05/30(土) 23:59:06.10 0
なんかもう無理な気がしてきたのでこの問題は>>45でやってもらうことにして
違う課題にいきますか?
62名無し募集中。。。:2009/05/31(日) 00:00:17.67 0
いきますか?って勝手に次進めんなよwww
63名無し募集中。。。:2009/05/31(日) 00:05:53.95 0
ノードをたどって行く順番ってわかってるの?
64名無し募集中。。。:2009/05/31(日) 00:08:18.35 0
これ実行結果を確かめる環境がないとそらでは無理だわ
65名無し募集中。。。:2009/05/31(日) 00:15:52.92 0
いきがかり上のなぞり
661:2009/05/31(日) 00:16:32.62 0
書き込みしてきたのでみなさんもいっしょに結果を待ちましょうね
67名無し募集中。。。:2009/05/31(日) 00:28:16.45 0
>>17にtailになった時の処理とinorderに括弧を表示する場合の処理を付け加えれば良いような
68名無し募集中。。。:2009/05/31(日) 02:11:03.32 0
これってもしかしてC言語によるデータ構造のリスト構造の問題?
そうだよね
69名無し募集中。。。:2009/05/31(日) 02:13:36.68 0
こういう奴って学生の時の課題だけで終わってしまうのが現実
実際ソフト会社就職してもまず使うことなんてありえないと思う
70名無し募集中。。。:2009/05/31(日) 02:19:58.92 0
最近使った
八分木だけど
71名無し募集中。。。:2009/05/31(日) 02:46:43.08 0
http://www.u-gakugei.ac.jp/~miyadera/LECTURE/ElecBook2/ptech20.htm

7.2.4 2分木の走査の例7−8 2分木を先行順走査してデータを出力せよ。の以下の関数を参考にすればいいと思う
・先行順走査(preorder)では
void printpreorder(BinNode *current )
{
if( current!= NULL ){
printf("%5d\n", current->data);
printpreorder( current->right );
printpreorder( current->left );
}
}

中間順走査(inorder)では
void printinorder(BinNode *current )
{
if( current!= NULL ){
printinorder( current->right );
printf("%5d\n", current->data);
printinorder( current->left );
}
}

後行順走査(postorder)では
void postorder(BinNode *current )
{
if( current!= NULL ){
printf("%5d\n", current->data);
postorder( current->left );
postorder( current->right );
}
}
72名無し募集中。。。:2009/05/31(日) 02:51:22.72 0
73名無し募集中。。。:2009/05/31(日) 03:03:41.11 0
これ習ってなかったらわからんな
74名無し募集中。。。:2009/05/31(日) 03:26:49.03 0
<解答はこちら>

#include <stdio.h>
#include <stdlib.h>

struct node {
struct node *right;
char key;
struct node *left;
};
typedef struct node * NodePointer;

void treeinitialize(void);
NodePointer makenode(char c);
void preorder(NodePointer node);
void inorder(NodePointer node);
void postorder(NodePointer node);

NodePointer head, tail;
75名無し募集中。。。:2009/05/31(日) 03:27:36.26 0
<メイン関数>

int main()
{
treeinitialize();

/* テスト用の木を作成 */
head->right=makenode('+');
head->right->left=makenode('1');
head->right->right=makenode('*');
head->right->right->left=makenode('2');
head->right->right->right=makenode('3');

/* トラバース */
printf("preorder: ");
preorder(head->right);
printf("\n");

printf("inorder: ");
inorder(head->right);
printf("\n");

printf("postorder: ");
postorder(head->right);
printf("\n");

return 0;
}
76名無し募集中。。。:2009/05/31(日) 03:28:23.60 0
<初期化関数とノード関数>

void treeinitialize(void)
{
head=makenode(-1);
tail=makenode(-1);
head->right=tail;
head->left=tail;
}

/*
* ノードを作成し、そのノードへのポインタを返す。
*/
NodePointer makenode(char c)
{
NodePointer x;
x=malloc(sizeof(struct node));
x->key=c;
x->right=tail;
x->left=tail;
return x;
}
77名無し募集中。。。:2009/05/31(日) 03:30:26.05 0
/* 先行順操作(再帰関数) */
void preorder(NodePointer node)
{
printf("%c\n", node->key);
preorder(node->right);
preorder(node->left);

}
/* 中間順操作(再帰関数) */
void inorder(NodePointer node)
{
inorder(node->right);
printf("%c\n", node->key);
inorder(node->left);
}
/* 後行順操作(再帰関数) */
void postorder(NodePointer node)
{
postorder(node->right);
postorder(node->left);
printf("%c\n", node->key);
}
78名無し募集中。。。:2009/05/31(日) 03:35:25.61 O
お前ら優しい奴らだな
79名無し募集中。。。:2009/05/31(日) 03:40:43.73 0
>>59 ある
入れ子になってるデータを扱うとき
HTML とか、図形をグループ化して新たな図形を定義できるシステムとか
給与計算とかじゃでてこない
80名無し募集中。。。:2009/05/31(日) 03:43:19.95 0
>>69
こんなの役に立たないと思うやつは
これが役に立つよーなソフト開発に縁がないわな
81名無し募集中。。。:2009/05/31(日) 04:53:12.93 0
使うとしても研究開発とかそういうとこぐらいだと思うよ
82名無し募集中。。。:2009/05/31(日) 05:10:05.82 0
木構造は元々DBを記述するために使われたデータ構造理論
実際はそれを用いたDBシステムを使いこなしてるようなもの
83名無し募集中。。。:2009/05/31(日) 06:25:38.38 0
再帰なんて全部ループで出来るからな
そのほうが理解しやすいから保守性も高まる
再帰を使うのを禁止にしてるプロジェクトも多い
84名無し募集中。。。:2009/05/31(日) 06:31:14.02 0
バカがリカーシブなメソッド作ると無限ループに陥るからな
85名無し募集中。。。:2009/05/31(日) 06:34:00.63 0
ハウリングだな
86名無し募集中。。。:2009/05/31(日) 06:46:57.60 0
スタックオーバーフローでハングw
87名無し募集中。。。:2009/05/31(日) 06:49:53.31 0
>>83
再帰は関数呼び出しのオーバーヘッドとかスタック食いつぶしとかデメリット多いしな
88名無し募集中。。。:2009/05/31(日) 06:50:19.71 0
Cの仕事から離れて10年になるが
sizeof(struct node)
これって記述合ってるのか?
89名無し募集中。。。:2009/05/31(日) 06:51:58.13 0
>>88
合ってるよ
C++ではstruct nodeの型名をnodeと書けるけど
Cではtypedefしない限りstructを省略できない
90名無し募集中。。。:2009/05/31(日) 06:53:31.85 0
構造体はいちいちstruct書かないと駄目なのか
91名無し募集中。。。:2009/05/31(日) 08:49:52.02 0
めんどくせぇ言語だなC
92名無し募集中。。。:2009/05/31(日) 09:30:41.47 0
>>77
これ tail で無限ループしないの
93名無し募集中。。。
毎年こんなスレ立つね