/*
[ プログラム ] C/C++の宿題片付けます 163代目
http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1361082416/302
302 名前:デフォルトの名無しさん []: 2013/02/24(日) 17:22:25.08
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
ハッシュ法を用いて作成してください。
1.追加 2.削除 3.探索 4.ダンプ 5.終了
処理を入力してください。:
仕様
表は00~12までです。
宜しくお願いします
[3.3] 言語: C
[4] 期限: 2013年2月25日まで]
*/
/*
[ プログラム ] C/C++の宿題片付けます 163代目
http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1361082416/335
335 名前:デフォルトの名無しさん []: 2013/02/24(日) 20:17:28.55
>>305
うまくいかないところは
・探索
・削除
15を追加すると3に入る。
削除したいときに、”何番を削除しますか?”で15ではなく3で削除できるようにすること
宜しくお願いします。
*/
#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)
{
}
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];
}
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;
}
return NULL;
}
int DeleteBucket(Hash * h, Data * x)
{
Bucket *p = SearchBucket(h, x);
if (p == NULL)
return 1;
p->stat = Deleted;
return 0;
}
void DumpHash(Hash * h)
{
int i;
for (i = 0; i < h->size; i++) {
switch (h->table[i].stat) {
case Occupied:
printf("%d (%s)\n", h
->table
[i
].
data.
no, h
->table
[i
].
data.
name); break;
case Empty:
break;
case Deleted:
break;
}
}
}
void PrintData(Data x)
{
printf("%d %s\n", x.
no, x.
name); }
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"); switch (i) {
case 1:
result = InsertBucket(&hash, &x);
if (result != 0) {
printf("追加に失敗しました(%s) \n", (result
== 1) ? "登録済み" : "満杯"); }
break;
case 2:
result = DeleteBucket(&hash, &x);
if (result == 1) {
}
break;
case 3:
result = DeleteBucket(&hash, &x);
if (temp == NULL) {
} else {
PrintData(temp->data);
}
break;
case 4:
DumpHash(&hash);
break;
case 5:
flag = 1;
break;
default:
break;
}
}
TermHash(&hash);
return 0;
}
LyoKICAgIFsg44OX44Ot44Kw44Op44OgIF0gQy9DKyvjga7lrr/poYzniYfku5jjgZHjgb7jgZkgMTYz5Luj55uuCiAgICBodHRwOi8vdC4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uaC5uZXQvdGVzdC9yZWFkLmNnaS90ZWNoLzEzNjEwODI0MTYvMzAyCiAgICAgICAgMzAyIOWQjeWJje+8muODh+ODleOCqeODq+ODiOOBruWQjeeEoeOBl+OBleOCkyBbXe+8miAyMDEzLzAyLzI0KOaXpSkgMTc6MjI6MjUuMDggIAogICAgICAgIFsxXSDmjojmpa3ljZjlhYPvvJog44OX44Ot44Kw44Op44Of44Oz44KwCiAgICAgICAgWzJdIOWVj+mhjOaWhyjlkKvjgrPjg7zjg4kmYW1wO+ODquODs+OCrynvvJogIAogICAgICAgIOODj+ODg+OCt+ODpeazleOCkueUqOOBhOOBpuS9nOaIkOOBl+OBpuOBj+OBoOOBleOBhOOAggogICAgICAgIDEu6L+95Yqg44CAMi7liYrpmaTjgIAzLuaOoue0ouOAgDQu44OA44Oz44OX44CANS7ntYLkuoYKICAgICAgICDlh6bnkIbjgpLlhaXlipvjgZfjgabjgY/jgaDjgZXjgYTjgILvvJoKICAgICAgICDku5Xmp5gKICAgICAgICDooajjga/vvJDvvJDvvZ7vvJHvvJLjgb7jgafjgafjgZnjgIIKICAgICAgICDlrpzjgZfjgY/jgYrpoZjjgYTjgZfjgb7jgZkKICAgICAgICBbMy4zXSDoqIDoqp7vvJogQyAgCiAgICAgICAgWzRdIOacn+mZkO+8miAyMDEz5bm0MuaciDI15pel44G+44GnXQoqLwovKgogICAgWyDjg5fjg63jgrDjg6njg6AgXSBDL0MrK+OBruWuv+mhjOeJh+S7mOOBkeOBvuOBmSAxNjPku6Pnm64KICAgIGh0dHA6Ly90Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5oLm5ldC90ZXN0L3JlYWQuY2dpL3RlY2gvMTM2MTA4MjQxNi8zMzUKICAgICAgICAzMzUg5ZCN5YmN77ya44OH44OV44Kp44Or44OI44Gu5ZCN54Sh44GX44GV44KTIFtd77yaIDIwMTMvMDIvMjQo5pelKSAyMDoxNzoyOC41NSAgIAogICAgICAgID4+MzA1ICAKICAgICAgICDjgYbjgb7jgY/jgYTjgYvjgarjgYTjgajjgZPjgo3jga8KICAgICAgICDjg7vmjqLntKIKICAgICAgICDjg7vliYrpmaQKICAgICAgICAxNeOCkui/veWKoOOBmeOCi+OBqO+8k+OBq+WFpeOCi+OAggogICAgICAgIOWJiumZpOOBl+OBn+OBhOOBqOOBjeOBq+OAgeKAneS9leeVquOCkuWJiumZpOOBl+OBvuOBmeOBi++8n+KAneOBp++8ke+8leOBp+OBr+OBquOBj++8k+OBp+WJiumZpOOBp+OBjeOCi+OCiOOBhuOBq+OBmeOCi+OBk+OBqAogICAgICAgIOWunOOBl+OBj+OBiumhmOOBhOOBl+OBvuOBmeOAgiAKKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojZGVmaW5lIE5PIDEKI2RlZmluZSBOQU1FIDIKCnR5cGVkZWYgZW51bSB7CiAgICBPY2N1cGllZCwgRW1wdHksIERlbGV0ZWQKfSBTdGF0dXM7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgbm87CiAgICBjaGFyIG5hbWVbMTBdOwp9IERhdGE7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBEYXRhIGRhdGE7CiAgICBTdGF0dXMgc3RhdDsKfSBCdWNrZXQ7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgc2l6ZTsKICAgIEJ1Y2tldCAqdGFibGU7Cn0gSGFzaDsKCmludCBoYXNoKGludCBrZXkpCnsKICAgIHJldHVybiAoa2V5ICUgMTMpOwp9CgppbnQgcmVoYXNoKGludCBrZXkpCnsKICAgIHJldHVybiAoKGtleSArIDEpICUgMTMpOwp9Cgp2b2lkIFNldEJ1Y2tldChCdWNrZXQgKiBuLCBEYXRhIHgsIFN0YXR1cyBzdGF0KQp7CiAgICBuLT5kYXRhID0geDsKICAgIG4tPnN0YXQgPSBzdGF0Owp9CgppbnQgSW5pdEhhc2goSGFzaCAqIGgsIGludCBzaXplKQp7CiAgICBpbnQgaTsKICAgIGgtPnNpemUgPSAwOwogICAgaWYgKChoLT50YWJsZSA9IGNhbGxvYyhzaXplLCBzaXplb2YoQnVja2V0KSkpID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGgtPnNpemUgPSBzaXplOwogICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgIGgtPnRhYmxlW2ldLnN0YXQgPSBFbXB0eTsKICAgIH0KICAgIHJldHVybiAxOwp9Cgp2b2lkIFRlcm1IYXNoKEhhc2ggKiBoKQp7CiAgICBmcmVlKGgtPnRhYmxlKTsKfQoKQnVja2V0ICpTZWFyY2hCdWNrZXQoSGFzaCAqIGgsIERhdGEgKiB4KQp7CiAgICBpbnQgaTsKICAgIGludCBrZXkgPSBoYXNoKHgtPm5vKTsKICAgIEJ1Y2tldCAqcCA9ICZoLT50YWJsZVtrZXldOwogICAgZm9yIChpID0gMDsgcC0+c3RhdCAhPSBFbXB0eSAmJiBpIDwgaC0+c2l6ZTsgaSsrKSB7CiAgICAgICAgaWYgKHAtPnN0YXQgPT0gT2NjdXBpZWQgJiYgcC0+ZGF0YS5ubyA9PSB4LT5ubykKICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAga2V5ID0gcmVoYXNoKGtleSk7CiAgICAgICAgcCA9ICZoLT50YWJsZVtrZXldOwogICAgfQogICAgaW50IEluc2VydEJ1Y2tldChIYXNoICogaCwgRGF0YSAqIHgpIHsKICAgICAgICBpbnQgaTsKICAgICAgICBpbnQga2V5ID0gaGFzaCh4LT5ubyk7CiAgICAgICAgQnVja2V0ICpwID0gJmgtPnRhYmxlW2tleV07CiAgICAgICAgaWYgKFNlYXJjaEJ1Y2tldChoLCB4KSkKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPnNpemU7IGkrKykgewogICAgICAgICAgICBpZiAocC0+c3RhdCA9PSBFbXB0eSB8fCBwLT5zdGF0ID09IERlbGV0ZWQpIHsKICAgICAgICAgICAgICAgIFNldEJ1Y2tldChwLCAqeCwgT2NjdXBpZWQpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAga2V5ID0gcmVoYXNoKGtleSk7CiAgICAgICAgICAgIHAgPSAmaC0+dGFibGVba2V5XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDI7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKaW50IERlbGV0ZUJ1Y2tldChIYXNoICogaCwgRGF0YSAqIHgpCnsKICAgIEJ1Y2tldCAqcCA9IFNlYXJjaEJ1Y2tldChoLCB4KTsKICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgcmV0dXJuIDE7CiAgICBwLT5zdGF0ID0gRGVsZXRlZDsKICAgIHJldHVybiAwOwp9Cgp2b2lkIER1bXBIYXNoKEhhc2ggKiBoKQp7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBoLT5zaXplOyBpKyspIHsKICAgICAgICBwcmludGYoIiUwMmQgOiIsIGkpOwogICAgICAgIHN3aXRjaCAoaC0+dGFibGVbaV0uc3RhdCkgewogICAgICAgIGNhc2UgT2NjdXBpZWQ6CiAgICAgICAgICAgIHByaW50ZigiJWQgKCVzKVxuIiwgaC0+dGFibGVbaV0uZGF0YS5ubywgaC0+dGFibGVbaV0uZGF0YS5uYW1lKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFbXB0eToKICAgICAgICAgICAgcHJpbnRmKCItLeacqueZu+mMsi0tXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBEZWxldGVkOgogICAgICAgICAgICBwcmludGYoIi0t5YmK6Zmk5riILS1cbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgUHJpbnREYXRhKERhdGEgeCkKewogICAgcHJpbnRmKCIlZCAlc1xuIiwgeC5ubywgeC5uYW1lKTsKfQoKRGF0YSBSZWFkKGNoYXIgKm1lc3NhZ2UsIGludCBzdykKewp9CgppbnQgbWFpbigpCnsKICAgIGludCBpLCByZXN1bHQsIGZsYWcgPSAwOwogICAgSGFzaCBoYXNoOwogICAgRGF0YSB4OwogICAgQnVja2V0ICp0ZW1wOwogICAgSW5pdEhhc2goJmhhc2gsIDEzKTsKICAgIHdoaWxlIChmbGFnICE9IDEpIHsKICAgICAgICBwcmludGYoIu+8ke+8jui/veWKoOOAgO+8ku+8juWJiumZpOOAgO+8k++8juaOoue0ouOAgO+8lO+8juODgOODs+ODl+OAgO+8le+8jue1guS6hlxuIik7CiAgICAgICAgcHJpbnRmKCLlh6bnkIbjgpLpgbjmip7jgZfjgabjgY/jgaDjgZXjgYQiKTsKICAgICAgICBzY2FuZigiJWQiLCAmaSk7CiAgICAgICAgc3dpdGNoIChpKSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBwcmludGYoIui/veWKoOOBmeOCi+ODh+ODvOOCv+OCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhFxuIik7CiAgICAgICAgICAgIHByaW50Zigi55Wq5Y+3Iik7CiAgICAgICAgICAgIHNjYW5mKCIlZCIsICZ4Lm5vKTsKICAgICAgICAgICAgcHJpbnRmKCLlkI3liY0iKTsKICAgICAgICAgICAgc2NhbmYoIiVzIiwgeC5uYW1lKTsKICAgICAgICAgICAgcmVzdWx0ID0gSW5zZXJ0QnVja2V0KCZoYXNoLCAmeCk7CiAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gMCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCLov73liqDjgavlpLHmlZfjgZfjgb7jgZfjgZ8oJXMpIFxuIiwgKHJlc3VsdCA9PSAxKSA/ICLnmbvpjLLmuIjjgb8iIDogIua6gOadryIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcHJpbnRmKCLliYrpmaTjgZnjgovjg4fjg7zjgr/jgpLlhaXlipvjgZfjgabjgY/jgaDjgZXjgYRcbiIpOwogICAgICAgICAgICBwcmludGYoIueVquWPtyIpOwogICAgICAgICAgICBzY2FuZigiJWQiLCAmeC5ubyk7CiAgICAgICAgICAgIHJlc3VsdCA9IERlbGV0ZUJ1Y2tldCgmaGFzaCwgJngpOwogICAgICAgICAgICBpZiAocmVzdWx0ID09IDEpIHsKICAgICAgICAgICAgICAgIHByaW50Zigi44Gd44Gu55Wq5Y+344Gv44GC44KK44G+44Gb44KTXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHByaW50Zigi55Wq5Y+3Iik7CiAgICAgICAgICAgIHNjYW5mKCIlZCIsICZ4Lm5vKTsKICAgICAgICAgICAgcmVzdWx0ID0gRGVsZXRlQnVja2V0KCZoYXNoLCAmeCk7CiAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50Zigi5o6i5p+744Gr5aSx5pWX44GX44G+44GX44GfXG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHByaW50Zigi5o6i5p+744Gr5oiQ5Yqf44GX44G+44GX44GfXG4iKTsKICAgICAgICAgICAgICAgIFByaW50RGF0YSh0ZW1wLT5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIER1bXBIYXNoKCZoYXNoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OgogICAgICAgICAgICBmbGFnID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcHJpbnRmKCLmraPjgZfjgYTmlbDlgKTjgpLlhaXlipvjgZfjgabjgY/jgaDjgZXjgYRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBUZXJtSGFzaCgmaGFzaCk7CiAgICByZXR1cm4gMDsKfQo=