- ベストアンサー
二分探索木
下のプログラムはコンパイルはできたのですが、実行すると「セグメンテーション違反です」とでました。デバッガをしてみたら、 Program received signal SIGSEGV, Segmentation fault. 0x080483e8 in inorder (root=0x0) at nibun.c:12 12 inorder(root->llink); と表示されましたが解決方法が分かりません。どのように直せば、エラーを出さずに実行できるようになるか教えてください。 #include<stdio.h> #include<stdlib.h> typedef struct node *NodeP; typedef struct node { int data; NodeP llink, rlink; } Node; void inorder(NodeP root) { inorder(root->llink); printf(" %d", root->data); inorder(root->rlink); } NodeP newNode(int val) { NodeP newp = (NodeP) malloc (sizeof(Node)); newp->data = val; newp->llink = NULL; newp->rlink = NULL; return newp; } void insert(NodeP *root, int val){ NodeP curr,prev; if(*root == NULL) *root = newNode(val); else{ curr = *root; do{ prev = curr; if ( val < curr->data) curr = curr->llink; else if ( val > curr->data) curr = curr->rlink; else return; }while(curr!= NULL); if(val > prev->data){ prev->llink = newNode(val); } else{ prev->rlink = newNode(val); } } } NodeP createBSTree(void){ int i,n,val; NodeP root=NULL; printf("Number of Nodes:"); scanf("%d",&n); for (i=1;i<=n;i++){ printf("Node[%d]: ",i); scanf("%d",&val); insert(&root,val); } return root; } int main(){ NodeP root=NULL; root = createBSTree(); inorder(root); printf("\n"); return 0; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
すべてチェックした訳ではありませんが inorder は呼び出さ れたら、落ちるまで呼び出されますね。つまり、終わりがない。 再帰関数は、最初に終了チェックが肝要です。 リンクがヌルだったらリターンなのかな。
その他の回答 (1)
- asuncion
- ベストアンサー率33% (2127/6289)
>if(val > prev->data){ >prev->llink = newNode(val); >} 左二分木にデータを挿入するのは、挿入したいデータの方が 親ノードのデータよりも「小さい」ときではないでしょうか。
お礼
回答ありがとうございました。 無事結果を得られることができました。
お礼
回答ありがとうございました。 助かりました。
補足
さっそく回答ありがとうごいました。 if(root->llink != NULL){inorder(root->llink);} if(root->rlink != NULL){inorder(root->rlink);} としたら、解決できました。 実行してみると、 Number of Nodes:4 Node[1]: 1 Node[2]: 2 Node[3]: 3 Node[4]: 4 4 1 と表示されて2と3が表示されないのですが どこが間違っているのでしょうか?よろしければ教えてください。