diff options
| author | Thibaut Horel <thibaut.horel@gmail.com> | 2015-07-01 22:27:48 -0700 |
|---|---|---|
| committer | Thibaut Horel <thibaut.horel@gmail.com> | 2015-07-01 22:27:48 -0700 |
| commit | e0abd9af6572ed9e2ef4adbb21ff0bf0beedd90d (patch) | |
| tree | 62225448dba667d53c43305b8e0e9f56824bb607 | |
| parent | fae7e090e8cfb3ced688930c7f8ffa00a44a5ca7 (diff) | |
| download | cover-e0abd9af6572ed9e2ef4adbb21ff0bf0beedd90d.tar.gz | |
More code
| -rw-r--r-- | main.c | 56 |
1 files changed, 53 insertions, 3 deletions
@@ -99,14 +99,64 @@ void remove_element(element* el) { } else { el->set->head = el->next; } - //demote(el->set); + demote(el->set); free(el); } void remove_parents(int id, parent** parents) { - for(parent* p=parents[id]; p != NULL; p = p->next) { + parent* temp; + parent* p = parents[id]; + while (p != NULL) { remove_element(p->pos); - free(p); + temp = p; + p = p->next; + free(temp); + } +} + +void remove_bucket(bucket* b) { + if (b->prev) { + b->prev->next = b->next; + } + if (b->next) { + b->next->prev = b->prev; + } + free(b); +} + +void demote(set* s) { + detach_set(s); + int size = s->bucket->size; + bucket* attach_point; + if (s->bucket->prev) { + attach_point = s->bucket->prev; + } else if (s->bucket->head) { + attach_point = s->bucket; + } else { + + } + remove_bucket(s->bucket); + attach_set(s, size, b); +} + +void detach_set(set* s) { + if (s->next) { + s->next->prev = s->prev; + } + if (s->prev) { + s->prev->next = s->next; + } else { + s->bucket->head = s->next; + } +} + +void attach_set(set* s, int size, bucket* b) { + if (b->size == size) { + insert_set(s, b); + } else { + bucket* nb = new_bucket(s, size); + nb->prev = b; + nb->next = b->next; } } |
