#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
long long Kontonummer;
int Pin;
float Guthaben;
int Eingabe;
int deleted;
} Kundendaten;
/*************************************************************************/
/* hash.c */
enum { HTS = 200 }; /* 100 Datensätze, d.h. möglichst mehr Einträge vorsehen */
typedef struct {
int s;
char (*knr)[99];
Kundendaten *kl;
} Hte;
typedef struct {
Hte liste[HTS];
} Ht;
static unsigned long hash(const char *k)
{ /* einfache Hashfunktion für Kontonummer als String */
unsigned long c, r = 5381;
while (c = *k++) {
r = ((r << 5) + r) + c;
}
return r;
}
void *ht_get(void *t,const char*key)
{
Ht *ht = t;
Hte e = ht->liste[hash(key) % HTS];
if (e.s)
{
int i;
for (i = 0; i < e.s; ++i)
return &e.kl[i];
}
return 0;
}
void ht_put(void *t, const char *key, Kundendaten k)
{
Ht *ht = t;
Hte *e = &ht->liste[hash(key) % HTS];
e
->kl
= realloc(e
->kl
, (e
->s
+ 1)*sizeof*e
->kl
); e
->knr
= realloc(e
->knr
, ++e
->s
*sizeof*e
->knr
); strcpy(e
->knr
[e
->s
- 1], key
); memcpy(&e
->kl
[e
->s
- 1], &k
, sizeof k
); }
void ht_free(void*t)
{
Ht *h = t;
int i;
for (i = 0; i < HTS; ++i)
{
Hte e = h->liste[i];
}
}
void *ht_new(void)
{
return calloc(HTS
, sizeof(Ht
)); }
void ht_printall(void *t, FILE*f, void (*pr)(Kundendaten, FILE *))
{
Ht *h = t;
int i;
for (i = 0; i < HTS; ++i)
{
Hte e = h->liste[i];
while (e.s--) pr(e.kl[e.s],f);
}
}
/* hash.c Ende */
/*************************************************************************/
const char *kontostr(Kundendaten k)
{
static char s[99];
return s;
}
void k_out(Kundendaten k, FILE *f)
{ /* Callback zur Ausgabe 1x Kunde */
fprintf(f
, "\n%lld : %d : %f : %d : %d", k.
Kontonummer, k.Pin,
k.Guthaben,
k.Eingabe,
k.deleted);
}
int main()
{
void *ht = ht_new(); /* anonymer void Zeiger für Hashtable-Objekt, der Aufrufer braucht die Interna nicht wissen */
Kundendaten k1 = { 12345678900, 4711, 1000., 100, 1 };
Kundendaten k2 = { 12345678902, 4713, 1002., 888, 0 };
Kundendaten k3 = { 12345678904, 4715, 1004., 0, 0 };
ht_printall(ht, stdout, k_out);
ht_put(ht, kontostr(k1), k1);
ht_printall(ht, stdout, k_out);
ht_put(ht, kontostr(k2), k2);
ht_printall(ht, stdout, k_out);
ht_put(ht, kontostr(k3), k3);
ht_printall(ht, stdout, k_out);
ht_put(ht, kontostr(k2), k2);
ht_printall(ht, stdout, k_out);
{
Kundendaten *k = ht_get(ht, kontostr(k2));
k_out(*k, stdout);
}
ht_free(ht);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdHlwZWRlZiBzdHJ1Y3QgIHsKICBsb25nIGxvbmcgS29udG9udW1tZXI7CiAgaW50IFBpbjsKICBmbG9hdCBHdXRoYWJlbjsKICBpbnQgRWluZ2FiZTsKICBpbnQgZGVsZXRlZDsKfSBLdW5kZW5kYXRlbjsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBoYXNoLmMgKi8KCmVudW0geyBIVFMgPSAyMDAgfTsgLyogMTAwIERhdGVuc8OkdHplLCBkLmguIG3DtmdsaWNoc3QgbWVociBFaW50csOkZ2Ugdm9yc2VoZW4gKi8KCnR5cGVkZWYgc3RydWN0IHsKICBpbnQgczsKICBjaGFyICgqa25yKVs5OV07CiAgS3VuZGVuZGF0ZW4gKmtsOwp9IEh0ZTsKCnR5cGVkZWYgc3RydWN0IHsKICBIdGUgbGlzdGVbSFRTXTsKfSBIdDsKCnN0YXRpYyB1bnNpZ25lZCBsb25nIGhhc2goY29uc3QgY2hhciAqaykKeyAvKiBlaW5mYWNoZSBIYXNoZnVua3Rpb24gZsO8ciBLb250b251bW1lciBhbHMgU3RyaW5nICovCiAgdW5zaWduZWQgbG9uZyBjLCByID0gNTM4MTsKICB3aGlsZSAoYyA9ICprKyspIHsKICAgIHIgPSAoKHIgPDwgNSkgKyByKSArIGM7CiAgfQogIHJldHVybiByOwp9Cgp2b2lkICpodF9nZXQodm9pZCAqdCxjb25zdCBjaGFyKmtleSkKewogIEh0ICpodCA9IHQ7CiAgSHRlIGUgPSBodC0+bGlzdGVbaGFzaChrZXkpICUgSFRTXTsKICBpZiAoZS5zKQogIHsKICAgIGludCBpOwogICAgZm9yIChpID0gMDsgaSA8IGUuczsgKytpKQogICAgaWYgKCFzdHJjbXAoa2V5LCBlLmtucltpXSkpCiAgICAgIHJldHVybiAmZS5rbFtpXTsKICB9CiAgcmV0dXJuIDA7Cn0KCnZvaWQgaHRfcHV0KHZvaWQgKnQsIGNvbnN0IGNoYXIgKmtleSwgS3VuZGVuZGF0ZW4gaykKewogIEh0ICpodCA9IHQ7CiAgSHRlICplID0gJmh0LT5saXN0ZVtoYXNoKGtleSkgJSBIVFNdOwogIGUtPmtsID0gcmVhbGxvYyhlLT5rbCwgKGUtPnMgKyAxKSpzaXplb2YqZS0+a2wpOwogIGUtPmtuciA9IHJlYWxsb2MoZS0+a25yLCArK2UtPnMqc2l6ZW9mKmUtPmtucik7CiAgc3RyY3B5KGUtPmtucltlLT5zIC0gMV0sIGtleSk7CiAgbWVtY3B5KCZlLT5rbFtlLT5zIC0gMV0sICZrLCBzaXplb2Ygayk7ICAKfQoKdm9pZCBodF9mcmVlKHZvaWQqdCkKewogIEh0ICpoID0gdDsKICBpbnQgaTsKICBmb3IgKGkgPSAwOyBpIDwgSFRTOyArK2kpCiAgewogICAgSHRlIGUgPSBoLT5saXN0ZVtpXTsKICAgIGlmIChlLnMpIGZyZWUoZS5rbnIpLCBmcmVlKGUua2wpOwogIH0KICBmcmVlKHQpOwp9Cgp2b2lkICpodF9uZXcodm9pZCkKewogIHJldHVybiBjYWxsb2MoSFRTLCBzaXplb2YoSHQpKTsKfQoKdm9pZCBodF9wcmludGFsbCh2b2lkICp0LCBGSUxFKmYsIHZvaWQgKCpwcikoS3VuZGVuZGF0ZW4sIEZJTEUgKikpCnsKICBIdCAqaCA9IHQ7CiAgaW50IGk7CiAgZm9yIChpID0gMDsgaSA8IEhUUzsgKytpKQogIHsKICAgIEh0ZSBlID0gaC0+bGlzdGVbaV07CiAgICB3aGlsZSAoZS5zLS0pIHByKGUua2xbZS5zXSxmKTsKICB9Cn0KCi8qIGhhc2guYyBFbmRlICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCmNvbnN0IGNoYXIgKmtvbnRvc3RyKEt1bmRlbmRhdGVuIGspCnsKICBzdGF0aWMgY2hhciBzWzk5XTsKICBzcHJpbnRmKHMsICIlbGxkIiwgay5Lb250b251bW1lcik7CiAgcmV0dXJuIHM7Cn0KCnZvaWQga19vdXQoS3VuZGVuZGF0ZW4gaywgRklMRSAqZikKeyAvKiBDYWxsYmFjayB6dXIgQXVzZ2FiZSAxeCBLdW5kZSAqLwogIGZwcmludGYoZiwgIlxuJWxsZCA6ICVkIDogJWYgOiAlZCA6ICVkIiwgay5Lb250b251bW1lciwKICAgIGsuUGluLAogICAgay5HdXRoYWJlbiwKICAgIGsuRWluZ2FiZSwKICAgIGsuZGVsZXRlZCk7Cn0KCmludCBtYWluKCkKewogIHZvaWQgKmh0ID0gaHRfbmV3KCk7IC8qIGFub255bWVyIHZvaWQgWmVpZ2VyIGbDvHIgSGFzaHRhYmxlLU9iamVrdCwgZGVyIEF1ZnJ1ZmVyIGJyYXVjaHQgZGllIEludGVybmEgbmljaHQgd2lzc2VuICovCgogIEt1bmRlbmRhdGVuIGsxID0geyAxMjM0NTY3ODkwMCwgNDcxMSwgMTAwMC4sIDEwMCwgMSB9OwogIEt1bmRlbmRhdGVuIGsyID0geyAxMjM0NTY3ODkwMiwgNDcxMywgMTAwMi4sIDg4OCwgMCB9OwogIEt1bmRlbmRhdGVuIGszID0geyAxMjM0NTY3ODkwNCwgNDcxNSwgMTAwNC4sIDAsIDAgfTsKCiAgaHRfcHJpbnRhbGwoaHQsIHN0ZG91dCwga19vdXQpOwogIGh0X3B1dChodCwga29udG9zdHIoazEpLCBrMSk7CiAgaHRfcHJpbnRhbGwoaHQsIHN0ZG91dCwga19vdXQpOwogIGh0X3B1dChodCwga29udG9zdHIoazIpLCBrMik7CiAgaHRfcHJpbnRhbGwoaHQsIHN0ZG91dCwga19vdXQpOwogIGh0X3B1dChodCwga29udG9zdHIoazMpLCBrMyk7CiAgaHRfcHJpbnRhbGwoaHQsIHN0ZG91dCwga19vdXQpOwogIGh0X3B1dChodCwga29udG9zdHIoazIpLCBrMik7CiAgaHRfcHJpbnRhbGwoaHQsIHN0ZG91dCwga19vdXQpOwoKICB7CiAgICBLdW5kZW5kYXRlbiAqayA9IGh0X2dldChodCwga29udG9zdHIoazIpKTsKICAgIHB1dHMoIlxuS3VuZGUgazIiKTsKICAgIGtfb3V0KCprLCBzdGRvdXQpOwogIH0KICAKICBodF9mcmVlKGh0KTsKICByZXR1cm4gMDsKfQo=