fix: Fixes in hasntable
This commit is contained in:
+21
-17
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user