二分探索木への挿入
今学校で二分探索木を勉強しています。二分探索木に要素を挿入したいのですが、うまくいかないのでアドバイスをいただけないでしょうか。ファイル中の英文を単語に分けてその出現頻度をカウントするプログラムです。とりあえず二分探索木を作るところまではなんとか完成させたいです。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <ctype.h>
typedef struct node Node;
struct node{
char *word;
int count;
Node *left,*right;
};
Node *root=NULL;
Node *compose(FILE *fp);
void inorder(Node *p);
int main(int argc, char *argv[])
{
FILE *fp;
Node *new;
fp=fopen(argv[1],"r");
if(fp==NULL){
puts("ファイルを開けません");
return(-1);
}
new=(Node *)malloc(sizeof(Node *));
new=compose(fp);
inorder(new);
return (0);
}
Node *compose(FILE *fp)
{
Node **p,*new;
char buf[20];
p=&root;
while(fscanf(fp,"%[-a-z-A-Z0-9_]",buf)!=EOF){
while(*p!=NULL){
(*p)->count=0; /*countを0で初期化したいけどwhileの外にこの1行を出すとエラーが出る*/
buf[0]=tolower(buf[0]);
strdup(buf);
if(strcasecmp(buf,(*p)->word)==0){ /*if文にしかはいらない…*/
(*p)->count++;
printf("%d\n",(*p)->count);
}else if(strcasecmp(buf,(*p)->word)<0){
p=&(*p)->left;
}else{
p=&(*p)->right;
}
}
new=(Node *)malloc(sizeof(Node *));
new->left=NULL;
new->right=NULL;
new->word=buf;
*p=new;
fscanf(fp,"%*[^-a-z-A-Z0-9_]");
}
return(new);
}
void inorder(Node *p)
{
if(p==NULL)
return;
printf("%s",p->word);
if(p->count!=0){
printf("%d",p->count);
}
inorder(p->right);
inorder(p->left);
}
補足
場合によって子の数が変わるので、たぶんB木なのかもしれません。ありがとうございます