fix: Fixes in hasntable

This commit is contained in:
2026-06-13 10:38:30 +02:00
parent 827f30908a
commit 497f06e20d
+21 -17
View File
@@ -12,7 +12,7 @@
struct entry struct entry
{ {
const char *key; const char *key;
void *value; void *value;
struct entry *next; struct entry *next;
}; };
@@ -99,7 +99,7 @@ void *hashtable_set(hashtable h, const char *key, void *value)
} }
// found replace the value // found replace the value
void *old_value = item.found->value; void *old_value = item.found->value;
item.found-> value = value; item.found->value = value;
return old_value; return old_value;
} }
@@ -120,36 +120,37 @@ void *hashtable_remove(hashtable h, const char *key)
return NULL; return NULL;
} }
// found, so detete it // found, so detete it
if (item.prev != NULL) { if (item.prev != NULL) {
item.prev->next = item.found->next; item.prev->next = item.found->next;
} else { } else {
h->table[item.index] = item.found->next; h->table[item.index] = item.found->next;
} }
// free unused memory // free unused memory
void *value = item.found->value; // remember value void *value = item.found->value; // remember value
free((void*) item.found->key); // free key free((void*) item.found->key); // free key
free((void*) item.found); // free entry free((void*) item.found); // free entry
return value; return value;
} }
void hashtable_destroy_bucket(hashtable h, int i) void hashtable_destroy_bucket(hashtable h, int i)
{ {
struct entry *e = h->table[i]; struct entry *e = h->table[i];
while (e != NULL) { while (e != NULL) {
struct entry *next = e->next;
free((void*)e->key); free((void*)e->key);
e = e->next;
free(e); free(e);
e = next;
} }
} }
void hashtable_destroy(hashtable h) void hashtable_destroy(hashtable h)
{ {
if (h==NULL) return; if (h == NULL) return;
for (int i = 0; i < h->size; i++) { for (int i = 0; i < h->size; i++) {
hashtable_destroy_bucket(h, i); hashtable_destroy_bucket(h, i);
} }
free (h->table); free(h->table);
free(h); free(h);
} }
@@ -158,7 +159,7 @@ ht_iterator hashtable_iter(hashtable h)
ht_iterator iter = { ht_iterator iter = {
.h = h, .h = h,
.index = -1, .index = -1,
.entry = NULL, .entry = NULL,
}; };
return iter; return iter;
@@ -171,12 +172,15 @@ bool ht_iter_next(ht_iterator *iter)
} }
hashtable h = iter->h; hashtable h = iter->h;
while(true) { while (true) {
if (iter->index >= h->size) { if (iter->index >= h->size) {
return false; return false;
} }
if (iter->entry == NULL) { if (iter->entry == NULL) {
iter->index++; iter->index++;
if (iter->index >= h->size) {
return false;
}
iter->entry = h->table[iter->index]; iter->entry = h->table[iter->index];
} else { } else {
iter->entry = iter->entry->next; iter->entry = iter->entry->next;