#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NO 1
#define NAME 2
typedef enum{
Occupied,Empty,Deleted
} Status;
typedef struct{
int no;
char name[10];
}Data;
typedef struct{
Data data;
Status stat;
} Bucket;
typedef struct{
int size;
Bucket *table;
} Hash;
int hash(int key){
return(key%13);
}
int rehash(int key){
return((key+1)%13);
}
void SetBucket(Bucket *n, Data x, Status stat){
n->data=x;
n->stat=stat;
}
int InitHash(Hash *h,int size){
int i;
h->size = 0;
if ((h->table = calloc(size, sizeof(Bucket))) == NULL) {
return 0;
}
h->size = size;
for (i = 0; i < size; i++) {
h->table[i].stat = Empty;
}
return 1;
}
void TermHash(Hash *h){
free(h->table);
}
Bucket *SearchBucket(Hash *h, Data *x){
int i;
int key = hash(x->no);
Bucket *p = &h->table[key];
for (i = 0; p->stat != Empty && i < h->size; i++) {
if (p->stat == Occupied && p->data.no == x->no)
return p;
key = rehash(key);
p = &h->table[key];
}
return NULL;
}
int InsertBucket(Hash *h, Data *x){
int i;
int key = hash(x->no);
Bucket *p = &h->table[key];
if (SearchBucket(h, x))
return 1;
for (i = 0; i < h->size; i++) {
if (p->stat == Empty || p->stat == Deleted){
SetBucket(p, *x, Occupied);
return 0;
}
key = rehash(key);
p = &h->table[key];
}
return 2;
}
int DeleteBucket(Hash *h,Data *x){
Bucket *p = SearchBucket(h, x);
if (p == NULL)
return 1;
p->stat = Deleted;
return 0;
}
void PrintData(Data x){
printf("%d (%s)\n", x.no, x.name);
}
void DumpHash(Hash *h){
int i;
for (i = 0; i < h->size; i++) {
printf("%02d :", i);
switch (h->table[i].stat) {
case Occupied : PrintData(h->table[i].data);break;//////////////////
case Empty : printf("--未登録--\n");break;
case Deleted : printf("--削除済--\n");break;
}
}
}
//Data Read(char *message,int sw){//////////////////
//} //////////////////
int main(){
int i, result, flag = 0;
Hash hash;
Data x;
Bucket *temp;
InitHash(&hash, 13);
while(flag != 1) {
printf("1.追加 2.削除 3.探索 4.ダンプ 5.終了\n");
printf("処理を選択してください");
scanf("%d", &i);
switch (i) {
case 1:
printf("追加するデータを入力してください\n");
printf("番号");
scanf("%d",&x.no);
printf("名前");
scanf("%s", x.name);
result=InsertBucket(&hash, &x);
if (result != 0) {
printf("追加に失敗しました(%s) \n",(result==1) ? "登録済み":"満杯");
}
break;
case 2:
printf("削除するデータを入力してください\n");
printf("番号");
scanf("%d", &x.no);
result = DeleteBucket(&hash,&x);
if(result == 1) {
printf("その番号はありません\n");
}
break;
case 3:
printf("番号");
scanf("%d", &x.no);
temp = SearchBucket(&hash, &x);//////////////////
if (temp == NULL){
printf("探査に失敗しました\n");
} else {
printf("探査に成功しました\n");
PrintData(temp->data);
}
break;
case 4:
DumpHash(&hash);
break;
case 5:
flag = 1;
break;
default:
printf("正しい数値を入力してください\n");
break;
}
}
TermHash(&hash);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojZGVmaW5lIE5PIDEKI2RlZmluZSBOQU1FIDIKCnR5cGVkZWYgZW51bXsKICAgIE9jY3VwaWVkLEVtcHR5LERlbGV0ZWQKfSBTdGF0dXM7Cgp0eXBlZGVmIHN0cnVjdHsKICAgIGludCBubzsKICAgIGNoYXIgbmFtZVsxMF07Cn1EYXRhOwoKdHlwZWRlZiBzdHJ1Y3R7CiAgICBEYXRhIGRhdGE7CiAgICBTdGF0dXMgc3RhdDsKfSBCdWNrZXQ7Cgp0eXBlZGVmIHN0cnVjdHsKICAgIGludCBzaXplOwogICAgQnVja2V0ICp0YWJsZTsKfSBIYXNoOwoKaW50IGhhc2goaW50IGtleSl7CiAgICByZXR1cm4oa2V5JTEzKTsKfQoKaW50IHJlaGFzaChpbnQga2V5KXsKICAgIHJldHVybigoa2V5KzEpJTEzKTsKfQoKdm9pZCBTZXRCdWNrZXQoQnVja2V0ICpuLCBEYXRhIHgsIFN0YXR1cyBzdGF0KXsKICAgIG4tPmRhdGE9eDsKICAgIG4tPnN0YXQ9c3RhdDsKfQoKaW50IEluaXRIYXNoKEhhc2ggKmgsaW50IHNpemUpewogICAgaW50IGk7CiAgICBoLT5zaXplID0gMDsKICAgIGlmICgoaC0+dGFibGUgPSBjYWxsb2Moc2l6ZSwgc2l6ZW9mKEJ1Y2tldCkpKSA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBoLT5zaXplID0gc2l6ZTsKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICBoLT50YWJsZVtpXS5zdGF0ID0gRW1wdHk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKdm9pZCBUZXJtSGFzaChIYXNoICpoKXsKICAgIGZyZWUoaC0+dGFibGUpOwp9CgpCdWNrZXQgKlNlYXJjaEJ1Y2tldChIYXNoICpoLCBEYXRhICp4KXsKICAgIGludCBpOwogICAgaW50IGtleSA9IGhhc2goeC0+bm8pOwogICAgQnVja2V0ICpwID0gJmgtPnRhYmxlW2tleV07CiAgICBmb3IgKGkgPSAwOyBwLT5zdGF0ICE9IEVtcHR5ICYmIGkgPCBoLT5zaXplOyBpKyspIHsKICAgICAgICBpZiAocC0+c3RhdCA9PSBPY2N1cGllZCAmJiBwLT5kYXRhLm5vID09IHgtPm5vKQogICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICBrZXkgPSByZWhhc2goa2V5KTsKICAgICAgICBwID0gJmgtPnRhYmxlW2tleV07CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKaW50IEluc2VydEJ1Y2tldChIYXNoICpoLCBEYXRhICp4KXsKICAgIGludCBpOwogICAgaW50IGtleSA9IGhhc2goeC0+bm8pOwogICAgQnVja2V0ICpwID0gJmgtPnRhYmxlW2tleV07CiAgICBpZiAoU2VhcmNoQnVja2V0KGgsIHgpKQogICAgICAgIHJldHVybiAxOwogICAgZm9yIChpID0gMDsgaSA8IGgtPnNpemU7IGkrKykgewogICAgICAgIGlmIChwLT5zdGF0ID09IEVtcHR5IHx8IHAtPnN0YXQgPT0gRGVsZXRlZCl7CiAgICAgICAgICAgIFNldEJ1Y2tldChwLCAqeCwgT2NjdXBpZWQpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAga2V5ID0gcmVoYXNoKGtleSk7CiAgICAgICAgcCA9ICZoLT50YWJsZVtrZXldOwogICAgfQogICAgcmV0dXJuIDI7Cn0KCmludCBEZWxldGVCdWNrZXQoSGFzaCAqaCxEYXRhICp4KXsKICAgIEJ1Y2tldCAqcCA9IFNlYXJjaEJ1Y2tldChoLCB4KTsKICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgcmV0dXJuIDE7CiAgICBwLT5zdGF0ID0gRGVsZXRlZDsKICAgIHJldHVybiAwOwp9Cgp2b2lkIFByaW50RGF0YShEYXRhIHgpewogICAgcHJpbnRmKCIlZCAoJXMpXG4iLCB4Lm5vLCB4Lm5hbWUpOwp9Cgp2b2lkIER1bXBIYXNoKEhhc2ggKmgpewogICAgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgaC0+c2l6ZTsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCIlMDJkIDoiLCBpKTsKICAgICAgICBzd2l0Y2ggKGgtPnRhYmxlW2ldLnN0YXQpIHsKICAgICAgICAgICAgY2FzZSBPY2N1cGllZCA6IFByaW50RGF0YShoLT50YWJsZVtpXS5kYXRhKTticmVhazsvLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgY2FzZSBFbXB0eSA6ICAgIHByaW50ZigiLS3mnKrnmbvpjLItLVxuIik7YnJlYWs7CiAgICAgICAgICAgIGNhc2UgRGVsZXRlZCA6ICBwcmludGYoIi0t5YmK6Zmk5riILS1cbiIpO2JyZWFrOwogICAgICAgIH0KICAgIH0KfQoKLy9EYXRhIFJlYWQoY2hhciAqbWVzc2FnZSxpbnQgc3cpey8vLy8vLy8vLy8vLy8vLy8vLwovL30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vCgppbnQgbWFpbigpewogICAgaW50IGksIHJlc3VsdCwgZmxhZyA9IDA7CiAgICBIYXNoIGhhc2g7CiAgICBEYXRhIHg7CiAgICBCdWNrZXQgKnRlbXA7CiAgICBJbml0SGFzaCgmaGFzaCwgMTMpOwogICAgd2hpbGUoZmxhZyAhPSAxKSB7CiAgICAgICAgcHJpbnRmKCLvvJHvvI7ov73liqDjgIDvvJLvvI7liYrpmaTjgIDvvJPvvI7mjqLntKLjgIDvvJTvvI7jg4Djg7Pjg5fjgIDvvJXvvI7ntYLkuoZcbiIpOwogICAgICAgIHByaW50Zigi5Yem55CG44KS6YG45oqe44GX44Gm44GP44Gg44GV44GEIik7CiAgICAgICAgc2NhbmYoIiVkIiwgJmkpOwogICAgICAgIHN3aXRjaCAoaSkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBwcmludGYoIui/veWKoOOBmeOCi+ODh+ODvOOCv+OCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhFxuIik7CiAgICAgICAgICAgICAgICBwcmludGYoIueVquWPtyIpOwogICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwmeC5ubyk7CiAgICAgICAgICAgICAgICBwcmludGYoIuWQjeWJjSIpOwogICAgICAgICAgICAgICAgc2NhbmYoIiVzIiwgeC5uYW1lKTsKICAgICAgICAgICAgICAgIHJlc3VsdD1JbnNlcnRCdWNrZXQoJmhhc2gsICZ4KTsKCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIui/veWKoOOBq+WkseaVl+OBl+OBvuOBl+OBnyglcykgXG4iLChyZXN1bHQ9PTEpID8gIueZu+mMsua4iOOBvyI6Iua6gOadryIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHByaW50Zigi5YmK6Zmk44GZ44KL44OH44O844K/44KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEXG4iKTsKICAgICAgICAgICAgICAgIHByaW50Zigi55Wq5Y+3Iik7CiAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCAmeC5ubyk7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBEZWxldGVCdWNrZXQoJmhhc2gsJngpOwogICAgICAgICAgICAgICAgaWYocmVzdWx0ID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIuOBneOBrueVquWPt+OBr+OBguOCiuOBvuOBm+OCk1xuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgcHJpbnRmKCLnlarlj7ciKTsKICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsICZ4Lm5vKTsKICAgICAgICAgICAgICAgIHRlbXAgPSBTZWFyY2hCdWNrZXQoJmhhc2gsICZ4KTsvLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpewogICAgICAgICAgICAgICAgICAgIHByaW50Zigi5o6i5p+744Gr5aSx5pWX44GX44G+44GX44GfXG4iKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCLmjqLmn7vjgavmiJDlip/jgZfjgb7jgZfjgZ9cbiIpOwogICAgICAgICAgICAgICAgICAgIFByaW50RGF0YSh0ZW1wLT5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBEdW1wSGFzaCgmaGFzaCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgZmxhZyA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByaW50Zigi5q2j44GX44GE5pWw5YCk44KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEXG4iKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIFRlcm1IYXNoKCZoYXNoKTsKICAgIHJldHVybiAwOwp9Cg==