diff options
| author | Thibaut Horel <thibaut.horel@gmail.com> | 2015-07-02 12:10:55 -0700 |
|---|---|---|
| committer | Thibaut Horel <thibaut.horel@gmail.com> | 2015-07-02 12:10:55 -0700 |
| commit | 0f600a65c7f33986df447c3611909037a6208d71 (patch) | |
| tree | 2be8603c89e5af71e07dd8aaad5bc3a4a73eec71 /main.c | |
| parent | e0abd9af6572ed9e2ef4adbb21ff0bf0beedd90d (diff) | |
| parent | ca00e84c08f91c783407f8e4e98fdff6b043aa05 (diff) | |
| download | cover-0f600a65c7f33986df447c3611909037a6208d71.tar.gz | |
Merge branch 'master' of horel.org:thibaut/cover
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 47 |
1 files changed, 38 insertions, 9 deletions
@@ -103,12 +103,10 @@ void remove_element(element* el) { free(el); } -void remove_parents(int id, parent** parents) { +void remove_parents(parent* p) { parent* temp; - parent* p = parents[id]; - while (p != NULL) { - remove_element(p->pos); - temp = p; + while (temp = p) { + remove_element(temp->pos); p = p->next; free(temp); } @@ -126,8 +124,26 @@ void remove_bucket(bucket* b) { void demote(set* s) { detach_set(s); - int size = s->bucket->size; + int size = s->bucket->size - 1; + bucket *; + if (!s->bucket->head) { + if(s->bucket->prev) { + remove_bucket(s->bucket); + } else { + attach + } + + remove_bucket(s->bucket); + } + + if (size == 0) { + free(s); + } + bucket* attach_point; + lse { + if(s->bucket-> + } if (s->bucket->prev) { attach_point = s->bucket->prev; } else if (s->bucket->head) { @@ -157,15 +173,28 @@ void attach_set(set* s, int size, bucket* b) { bucket* nb = new_bucket(s, size); nb->prev = b; nb->next = b->next; + nb->prev->next = nb; + nb->next->prev = nb; } } void greedy(bucket* head, parent** parents) { bucket* b = head; - for(set* s=b->head; s != NULL; s = s->next) { - for (element* el = s->head; el != NULL; el = el->next) { - remove_parents(el->id, parents); + element* current = b->head->head; + element* temp; + while (1) { + temp = current; + if (current->next) { + current = current->next; + } else if (current->set->next) { + current = current->set->next->head; + } else if (current->set->bucket->prev) { + current = current->set->bucket->prev->head->head; + } else { + remove_parents(parents[temp->id]); + break; } + remove_parents(parents[temp->id]); } } |
