
void read_dic()
{
char eng2[20], jp2[40];
FILE *fp;
int i=0;
if((fp=fopen("dic.txt", "r"))==NULL) {
printf("\n ファイルがありません\n");
exit(1);
} else {
printf("読み込み中...\n");
while (!feof(fp)) {
fscanf(fp, "%s %s", eng2, jp2);
strcpy(table[i].eng, eng2);
strcpy(table[i].jp, jp2);
i++;
if(i>=100){
printf("辞書のテーブルがいっぱいです\n");
fclose(fp);
exit(1);
}
}
fclose(fp);
printf("読み込み終了\n");
n = i;
}
}
int hash(char *tango)
{
int h=0,p=256;
while (*tango!='\0')
{
h = h*p + *tango;
h = h%BUCKET_SIZE;
tango++;
}
return(h);
}
struct cell *find(char *tango)
{
int a;
struct cell *q;
a=hash(tango);
if(bucket[a].chain==NULL)
return NULL;
else{
q=bucket[a].chain;
while ((strcmp(q->eng,tango))!=0){
if(q->next==NULL)
return NULL;
else
q=q->next;
}
return q;
}
}
以前の投稿は
http://oshiete1.goo.ne.jp/kotaeru.php3?qid=109202
No.5ベストアンサー
- 回答日時:
まだ抜けていました。
ハッシュテーブルを検索するときに table[x]->next が NULL なのかどうなのかを
チェックしますので、テーブルを作成するときまたは初期化するときに、この next
を NULL にしておかなければうまく動かない可能性があります。
実行環境によっては明示的に初期化しなくても NULL になっている場合もあります
が、他人任せにしておくのはよくありません。
read_dic()関数内の読み込みのところで
strcpy(table[i].eng, eng2);
strcpy(table[i].jp, jp2);
とやっているところがあるので、この直後に次の行を追加して下さい。
table[i].next = NULL;
ついでに補足すると、init_table()が呼び出されていませんので、read_dic() を呼び
出す前ぐらいに init_table() も呼び出してあげましょう。
No.4
- 回答日時:
ranxさんがすでに指摘されている点は、少なくとも修正が必要です。
それに加えて、ハッシュテーブル bucket[] を作成する処理が全く抜けています
ので今のままでは「白紙の辞書」を見て検索しているに過ぎません。
ハッシュテーブル作成処理
例えば、こんな感じの関数を作って read_dic() の後で hash_table() を
呼び出します。
void hash_table()
{
int i, h;
struct cell **p
for( i=0; i<BUCKET_SIZE; i++ )
bucket[i].cell = NULL;
for( i=0; i<n; i++ ){
h = hash( table[i].eng );
p = &(bucket[h].cell);
while( *p != NULL )
p = &(*p->next);
*p = &(table[i]);
}
}
(上記のソースには全角の空白文字が使われています。全角を半角に変換して
使って下さい)
No.3
- 回答日時:
自己フォロー。
>またmain()で使用しているread_dic()関数とfind()関数が記載されていないの
>で、その信憑性も不明です。(「まだ続きます。。。」に続くのかな?)
この部分については次の質問に書かれていましたね。失礼しました。m(_ _)m
No.2
- 回答日時:
まず「実行できません。
」では具体的にどういう症状なのか全くわかりません。command not found なのですか?たぶん違いますよね。詳しく書きましょう。
またmain()で使用しているread_dic()関数とfind()関数が記載されていないので、その信憑性も不明です。(「まだ続きます。。。」に続くのかな?)
失礼ですが学生さんでしょうか?まず有効な回答が期待できそうな質問の仕方を精進して下さい。そうすることで自分の頭の中が整理できて自己解決できることも多いです。プログラミングってやつは。
それから人にソースを見てもらうならインデント付けくらいは何とかしましょう。
以上、苦言を並べてしまいましたが、あなたの成長を願ってあえて辛辣に書かせて頂きましたのでご理解ください。
アドバイスありがとうございました。初めて質問したので質問の仕方がわからなくてお粗末な質問内容になってしまいました。それについてのアドバイスもありがとうございました。明日早速学校でプログラムを修正してみようと思います。
No.1
- 回答日時:
全体を見たわけではないので自信なしとしておきますが、
struct cell *find(char *tango);
と宣言されているのに、その戻り値
p= find(tango)
を
table[p].jp
と配列の引数にしているのは変ですね。
p->jp
のおつもりなのでは。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GlobalAlloc生成メモリの開放で...
-
C言語でファイル読み書きを早く...
-
c言語でのfscanfについて
-
C言語にてXMLファイルから任意...
-
ファイルの特定行の抽出
-
最早開始時間と最遅完了時刻を...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
値差の%計算方法について
-
数字以外が入力されたらエラー...
-
「Aに対するBの割合」と「Aに対...
-
VB6.0での小数点の扱いについて
-
【C++】関数ポインタの使い方
-
c languageで 簡単な質問があ...
-
ある商品のロス率を5%見込み、...
-
既定のコンストラクタがありま...
-
CTabCtrl:TABインデックス単位...
-
charと%c , %s の関係について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数ファイルの同時読み込みの...
-
C言語の課題です
-
ファイル出力で改行を入れたい!
-
fgets( ) の返り値は何?
-
C言語でファイル読み書きを早く...
-
fopenでファイル名に、変数を使...
-
ファイルに行番号を追加
-
テキストファイル内に対して, ...
-
ファイルへの書込み処理が異常...
-
C言語についてアドバイスをくだ...
-
同時にファイル読み込み 書き込み
-
初心者のc言語
-
大量の入力ファイルを扱うとき...
-
【C言語について】ファイル名の...
-
C言語 共用体の構造体の引数設定
-
C言語でのCSVソートとデータ抽...
-
エラーがわかりません、、
-
プログラムの内で、何か画面表...
-
「コマンドライン引数チェック...
-
プログラミングのデータの読み込み
おすすめ情報