• ベストアンサー

線形リスト

ファイルから単語を読み込んでいき、単語とその単語の数を出力するプログラムです。単語の区切り方は英文字以外の時です。 例 http://www.sig.sig.org だったとしたら http 1回 www 1回 sig 2回 org 1回 という課題なのですが、while文で読み込んで英文字以外が入力されるたびにif文でぬけ、単語の登録、比較するプログラムを作ったのですが、まったく動きません。(たぶん関数への引渡しとかがおかしいのだと思うのですが) どこがどうちがうのか教えてくださいお願いします。 #include<stdio.h> struct node{//構造体 int count; char tango[20]; struct node *next; }; struct node *new(char t[20]) {//単語の入力 struct node *p; strcpy(p->tango,t); p->count=0; return p; } struct node *in(struct node *p,char t[20]) {//単語の比較 int c; c=strcmp(p->tango,t); if(c==0){ p->count++; return p; } else if(p->next==NULL) {p->next=new(t);} else {in(p->next,t);} } int *pt(struct node *p){//出力 if(p==NULL)return; else printf("%s:%d\n",p->tango,p->count); pt(p->next); } int main() { FILE *fp; int b,i; char a[20],ch; struct node *root; i=0;b=0; for(i=0;i<20;i++) a[i]=0;//初期化 i=0; fp=fopen("data1.txt","r"); if(fp==NULL)//ファイルを開く return; while((ch=fgetc(fp)) != EOF){//文字の読み込み if(!((97<=ch)&&(ch<=122)&&(65<=ch)&&(ch<=90))){//英字以外の時 b=b+1; if(b==0)//初期のみ root=new(a); else//それ以降 in(root,a); for(i=0;i<20;i++){//初期化 a[i]=0; i=0; } } else{//英文字の時 a[i]=ch; i=i+1; } } pt(root);//出力関数へ fclose(fp); }

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

ざっと見てすぐに気がつくのは、new関数で > struct node *p; pがどこを指しているか不定の状態で > strcpy(p->tango,t); > p->count=0; こういうことをすると、プログラムが落ちてしまうであろう、 というところです。

Mr_KZ
質問者

お礼

メモリを確保するということですか? b,iの位置がおかしかったのでそれの変更と、メモリを確保するようにして動作はするようになったのですが、文字の入力がちゃんとされてないみたいなのです(中をみるとNULL)、なぜかわかりますか。お願いします。 #include<stdio.h> struct node{//構造体 int count; char tango[20]; struct node *next; }; struct node *new(char t[20]) {//単語の入力 struct node *p; p=malloc(sizeof(struct node)); strcpy(p->tango,t); p->count=0; return p; } struct node *in(struct node *p,char t[20]) {//比較 int c; c=strcmp(p->tango,t); if(c==0){ p->count++; return p; } else if(p->next==NULL) {p->next=new(t);} else {in(p->next,t);} } int *pt(struct node *p){//出力 if(p==NULL)return; else printf("%s:%d\n",p->tango,p->count); pt(p->next); } int main() { FILE *fp; int b,i; char a[20],ch; struct node *root; i=0;b=0; for(i=0;i<20;i++)//初期化 a[i]=0; i=0; fp=fopen("data1.txt","r");//ファイルを開く if(fp==NULL) return; while((ch=fgetc(fp)) != EOF){//文字読み込み if(!((97<=ch)&&(ch<=122)&&(65<=ch)&&(ch<=90))){英文字じゃない時 if(b==0)//初回 root=new(a); else//それ以降 in(root,a); b=b+1; for(i=0;i<20;i++) a[i]=0;//初期化 i=0; } else{//英文字の時 a[i]=ch; printf("%s",ch); i=i+1; } } pt(root); fclose(fp); }

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ぱっと見だけど ・「初期のみ」のところは通らないんだけど, それでいいの? ・英字かどうかの判定には (ctype.h を #include して) isalpha を使え ・英字が 20文字以上続くとアウト ・new() で next に NULL を設定していない あたりは気になる.

Mr_KZ
質問者

お礼

英字の判定がおかしくて動かなかったみたいです。そこを直したら動きましたありがとうございます。

関連するQ&A