• ベストアンサー

ハッシュ法の質問

#include <stdlib.h> #include <stdio.h> #include <string.h> #define M 257 int zoo(char *v){ int x; x=0; while(*v) x = 256*x + (*v++); if (x<0) x=(-x); return(x%M);} #define CHARMAX 10000 static int chartop=0; static int charbtm=CHARMAX; static char charheap[CHARMAX]; char *goo(char *s){ char *cp; int i,j,len,result; cp =s; len=0; while(*cp++) len++; len++; if(charbtm - chartop < len){ printf("errrrrrrrrrrrrrrrrrrrr"); exit(1);} result = chartop; j=chartop; chartop += len; cp=s; for (i=0;i<len;i++) charheap[j+i]=(*cp++); return(&charheap[result]);} struct item {char *id; int info;}; static struct item table[M]; void initialize(){ int i; for(i=0; i<M; i++){ table[i].id=goo(" ");}} void enter(char *id1, int info1){ int x; x=zoo(id1); while(strcmp(table[x].id, " ")) x=(x+1)%M; table[x].id =goo(id1); table[x].info=info1;} int search(char *id1){ int x; x=zoo(id1); while(strcmp(table[x].id,id1)) x=(x+1)%M; return(table[x].info);} main(){ int t; initialize(); enter("takahasi",1234); enter("kato",2345); enter("saito",4532); printf("%d\n",search("takahasi")); printf("%d\n",search("kato")); printf("%d\n",search("saito")); } これは学生の学籍番号を登録し、登録した名前から番号を検索するプログラムです。 1.このプログラムでは何人まで登録できますか? 2.その人数を超えた場合何が起こるか。 3.配列charheap、配列tableには何が格納されているか という問題があたのですが上の3つの問題がわかりません。誰か教えてください。1・は10000かなっておもいましたが違うようです。

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

  • ベストアンサー
回答No.3

1.不明 →格納できる配列の大きさはソース中に記されているが、 →それ以外の要素による制限がある。 →「それ以外の要素」は入力に依存するため、 →結果として「不明」である。 →※1人38文字未満なら「ソース中に記されている」人 →※10000 / 「ソース中に記されている」 = 38.9 2. →while(strcmp(table[x].id, " ")) x=(x+1)%M; →xがとりうる範囲と、そのときの挙動は? 3. →char *goo()とvoid enter()関数が →何をしているか追いかければわかります。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

ヒントのみ。 関数zoo・・・ハッシュ計算 関数*goo・・・氏名蓄積処理 関数initialize・・・初期化 関数enter・・・ハッシュ表への登録 関数search・・・ハッシュ表の検索 1,2は判りやすいですが、3は関数*gooとのからみが若干難しいので 少し悩んでください。 がんばってください。

すると、全ての回答が全文表示されます。
回答No.1

答はすべてコードの中に'明快に'記されています。

すると、全ての回答が全文表示されます。

関連するQ&A