現在、事前に作成した連結リストをもとに二分探索木を作成しようとしています。
ノード定義:
node
1typedef struct school_record SRec; 2struct school_record{ 3 float gpa;/*累積GPA*/ 4 int credit;/*累積単位数*/ 5 char name[200];/*名前(アルファベット)*/ 6 SRec *next; /*次のセルへのポインタ*/ 7 SRec *left,*right;/*二分探索木で用いる部分木へのポインタ*/ 8};
連結リストとしてノードをつなぐ処理をした際に各ノードのleft,rightにはNULLを代入しています。
連結リストから二分探索木を作成するための関数(未完成):
C
1SRec *create_tree(SRec *front,int (*comp)(const void *, const void *)){ 2 int order;/*比較関数の結果を格納する*/ 3 SRec **p;/*二分探索木をたどるためのダブルポインタ,"ノードを指すポインタ"を指すポインタ*/ 4 SRec *tree;/*二分探索木の先頭*/ 5 tree = front;/*ポインタtreeがリストの先頭frontを指す*/ 6 p = &tree;/*ダブルポインタがリストの先頭を指しているポインタを指す*/ 7 8 9while((*p)->next != NULL){/*連結リストのノード回数繰り返す=nextがNULLになる(ノードの最後)まで*/ 10 while(*p){/*ダブルポインタpが指しているポインタがNULLポインタでない限り続ける*/ 11 12 13 order = (*comp)(*p,(*p)->next);/*ダブルポインタpが指しているポインタの指す先と、どこを比較するのか??*/ 14 15 if(order<0){ 16 p = &((*p)->right); 17 /*右部分木に進み、pを変更する*/ 18 }else{ 19 p = &((*p)->left); 20 /*左部分木に進み、pを変更する*/ 21 } 22 } 23 24 /*二分探索木をつなげる*/ 25} 26 27 28 return tree; 29} 30
第1引数で受け取るfrontは連結リストの先頭ノードへのポインタ、そして第2引数で受け取るのはノードの値を比較する自作比較関数で、比較するメンバはコマンドライン引数で指定し以下のように呼び出します。
if(strcmp(argv[1],"credit")==0){/*argv[1]で指定されたメンバでソートし、先頭要素のポインタををsort_frontに代入する*/ tree_front = create_tree(front,comp_credit); }else if(strcmp(argv[1],"gpa")==0){ tree_front = create_tree(front,comp_gpa); }else if(strcmp(argv[1],"name")==0){ tree_front = create_tree(front,comp_name); }else{ printf("ソートしたいフィールドをcredit/gpa/nameの中から正しく選択してください。\n"); }
以上のようにコードを書いていたのですが、
create_tree関数で、どのように繰り返し文を書きノードを書けばいいのかわかりません。
どなかたかわかる方がいればヒントなど教えていただければ幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/25 11:07
2019/07/25 12:24
2019/07/25 12:33
2019/07/25 12:40
2019/07/25 13:03