- ベストアンサー
C言語の課題:ハッシュ(オープンアドレス法)の実装方法とプログラム作成の手順
- C言語の課題であるハッシュ(オープンアドレス法)の実装方法とプログラム作成の手順を解説します。
- 問題の内容は、名前と年齢を入力し、名前をキーとしてハッシュ(オープンアドレス法)に登録することです。
- さらに、名前が入力されるとハッシュ法を使って検索し、あればその人のデータをハッシュから削除するプログラムも作成します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ちょっと難しくなったかもしれませんが 質問者さんなら解かると思います。 ずらし処理を抜いてシンプルにしています。 補足なのですが、氏名をキーにすると氏名そのものを 直接、照合すればいいのでキーの意味を持ちません。 本来はハッシュキー値をキーにして照合させ、候補される 複数の氏前をユーザ選択させる方式の方が妥当かと思いますが 以下リストは、あえて氏名文字列を利用した冗長処理にしています。 <リスト> #include <stdio.h> #include <stdlib.h> #include <string.h> int hash(char *name) { int ret=0; while (*name)ret += *name++; return ret%5; } int rehash(int h) { return (h+1)%5; } void err_disp() { printf("\n別キーが使用済みです。\n"); } int main() { int key[5],age[5],i,k,c=0,err; char name[5][15],temp[15]; for (i=0;i<5;i++) key[i]=-1,age[i]=0,name[i][0]=0; i=0; while (1) { printf("氏名?"); scanf("%s15",temp); if (*temp=='-' && !*(temp+1)) break; k=i=hash(temp),err=0; if (*name[i] && key[i]!=k) {err_disp();break;} while (*name[i] && key[i]==k) { if (k==(i=rehash(i)) || *name[i] && key[i]!=k) err=1; } if (err) {err_disp();break;} strcpy(name[i],temp); key[i]=k; printf("年齢?"); scanf("%3d",&age[i]); if (++c>=5) break; } printf("\n検索氏名?"); scanf("%s15",temp); printf("\n"); for (k=i=hash(temp);k==key[i];i=++i%5) { if (!strcmp(temp,name[i])) *name[i]=0; } for (i=0;i<5;i++) { if (*name[i]) printf("%s %d歳\n",name[i],age[i]); } return 0; }
お礼
少々自分には厳しいですが、頑張って読んでみたいとおもいます。 ありがとうございました。