fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct {
  6. long long Kontonummer;
  7. int Pin;
  8. float Guthaben;
  9. int Eingabe;
  10. int deleted;
  11. } Kundendaten;
  12.  
  13. /*************************************************************************/
  14. /* hash.c */
  15.  
  16. enum { HTS = 200 }; /* 100 Datensätze, d.h. möglichst mehr Einträge vorsehen */
  17.  
  18. typedef struct {
  19. int s;
  20. char (*knr)[99];
  21. Kundendaten *kl;
  22. } Hte;
  23.  
  24. typedef struct {
  25. Hte liste[HTS];
  26. } Ht;
  27.  
  28. static unsigned long hash(const char *k)
  29. { /* einfache Hashfunktion für Kontonummer als String */
  30. unsigned long c, r = 5381;
  31. while (c = *k++) {
  32. r = ((r << 5) + r) + c;
  33. }
  34. return r;
  35. }
  36.  
  37. void *ht_get(void *t,const char*key)
  38. {
  39. Ht *ht = t;
  40. Hte e = ht->liste[hash(key) % HTS];
  41. if (e.s)
  42. {
  43. int i;
  44. for (i = 0; i < e.s; ++i)
  45. if (!strcmp(key, e.knr[i]))
  46. return &e.kl[i];
  47. }
  48. return 0;
  49. }
  50.  
  51. void ht_put(void *t, const char *key, Kundendaten k)
  52. {
  53. Ht *ht = t;
  54. Hte *e = &ht->liste[hash(key) % HTS];
  55. e->kl = realloc(e->kl, (e->s + 1)*sizeof*e->kl);
  56. e->knr = realloc(e->knr, ++e->s*sizeof*e->knr);
  57. strcpy(e->knr[e->s - 1], key);
  58. memcpy(&e->kl[e->s - 1], &k, sizeof k);
  59. }
  60.  
  61. void ht_free(void*t)
  62. {
  63. Ht *h = t;
  64. int i;
  65. for (i = 0; i < HTS; ++i)
  66. {
  67. Hte e = h->liste[i];
  68. if (e.s) free(e.knr), free(e.kl);
  69. }
  70. free(t);
  71. }
  72.  
  73. void *ht_new(void)
  74. {
  75. return calloc(HTS, sizeof(Ht));
  76. }
  77.  
  78. void ht_printall(void *t, FILE*f, void (*pr)(Kundendaten, FILE *))
  79. {
  80. Ht *h = t;
  81. int i;
  82. for (i = 0; i < HTS; ++i)
  83. {
  84. Hte e = h->liste[i];
  85. while (e.s--) pr(e.kl[e.s],f);
  86. }
  87. }
  88.  
  89. /* hash.c Ende */
  90. /*************************************************************************/
  91.  
  92.  
  93. const char *kontostr(Kundendaten k)
  94. {
  95. static char s[99];
  96. sprintf(s, "%lld", k.Kontonummer);
  97. return s;
  98. }
  99.  
  100. void k_out(Kundendaten k, FILE *f)
  101. { /* Callback zur Ausgabe 1x Kunde */
  102. fprintf(f, "\n%lld : %d : %f : %d : %d", k.Kontonummer,
  103. k.Pin,
  104. k.Guthaben,
  105. k.Eingabe,
  106. k.deleted);
  107. }
  108.  
  109. int main()
  110. {
  111. void *ht = ht_new(); /* anonymer void Zeiger für Hashtable-Objekt, der Aufrufer braucht die Interna nicht wissen */
  112.  
  113. Kundendaten k1 = { 12345678900, 4711, 1000., 100, 1 };
  114. Kundendaten k2 = { 12345678902, 4713, 1002., 888, 0 };
  115. Kundendaten k3 = { 12345678904, 4715, 1004., 0, 0 };
  116.  
  117. ht_printall(ht, stdout, k_out);
  118. ht_put(ht, kontostr(k1), k1);
  119. ht_printall(ht, stdout, k_out);
  120. ht_put(ht, kontostr(k2), k2);
  121. ht_printall(ht, stdout, k_out);
  122. ht_put(ht, kontostr(k3), k3);
  123. ht_printall(ht, stdout, k_out);
  124. ht_put(ht, kontostr(k2), k2);
  125. ht_printall(ht, stdout, k_out);
  126.  
  127. {
  128. Kundendaten *k = ht_get(ht, kontostr(k2));
  129. puts("\nKunde k2");
  130. k_out(*k, stdout);
  131. }
  132.  
  133. ht_free(ht);
  134. return 0;
  135. }
  136.  
Success #stdin #stdout 0s 2184KB
stdin
Standard input is empty
stdout
12345678900 : 4711 : 1000.000000 : 100 : 1
12345678900 : 4711 : 1000.000000 : 100 : 1
12345678902 : 4713 : 1002.000000 : 888 : 0
12345678900 : 4711 : 1000.000000 : 100 : 1
12345678902 : 4713 : 1002.000000 : 888 : 0
12345678904 : 4715 : 1004.000000 : 0 : 0
12345678900 : 4711 : 1000.000000 : 100 : 1
12345678902 : 4713 : 1002.000000 : 888 : 0
12345678902 : 4713 : 1002.000000 : 888 : 0
12345678904 : 4715 : 1004.000000 : 0 : 0
Kunde k2

12345678902 : 4713 : 1002.000000 : 888 : 0