dlist: insert sort [not finished]
This commit is contained in:
+57
-1
@@ -19,6 +19,62 @@ dlist_t *_dlist_init(void *el_ptr, int el_siz) {
|
||||
return dlist;
|
||||
}
|
||||
|
||||
void _dlist_insert(dlist_t *dlist, dlist_el_t *new_el, dlist_el_t *prev_el) {
|
||||
if (prev_el != NULL) {
|
||||
new_el->next = prev_el->next;
|
||||
prev_el->next->previous = new_el;
|
||||
new_el->previous = prev_el;
|
||||
prev_el->next = new_el;
|
||||
if (new_el->next == NULL) {
|
||||
dlist->current = new_el;
|
||||
dlist->pointer = new_el;
|
||||
}
|
||||
} else {
|
||||
new_el->next = dlist->current;
|
||||
new_el->previous = NULL;
|
||||
dlist->start = new_el;
|
||||
dlist->current->previous = new_el;
|
||||
}
|
||||
dlist->len++;
|
||||
}
|
||||
|
||||
void _dlist_insert_end(dlist_t *dlist, dlist_el_t *new_el) {
|
||||
dlist->current->next = new_el;
|
||||
new_el->previous = dlist->current;
|
||||
new_el->next = NULL;
|
||||
dlist->current = new_el;
|
||||
dlist->pointer = new_el;
|
||||
dlist->len++;
|
||||
}
|
||||
|
||||
void _dlist_insert_sort(dlist_t *dlist, void *el_ptr, int el_siz,
|
||||
dblist_cb_t *cb) {
|
||||
dlist_el_t *d_el = malloc(sizeof(dlist_el_t));
|
||||
d_el->el_ptr = malloc(el_siz);
|
||||
memcpy(d_el->el_ptr, el_ptr, el_siz);
|
||||
|
||||
dlist_el_t *dlist_item = dlist->start;
|
||||
bool res = true;
|
||||
if (dlist->start == NULL) {
|
||||
dlist->start = d_el;
|
||||
dlist->current = d_el;
|
||||
d_el->next = NULL;
|
||||
d_el->previous = NULL;
|
||||
dlist->pointer = d_el;
|
||||
dlist->len++;
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < dlist->len; i++) {
|
||||
res = cb(el_ptr, dlist_item->el_ptr);
|
||||
if (!res) {
|
||||
dlist_item = dlist_item->previous;
|
||||
_dlist_insert(dlist, d_el, dlist_item);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (res) _dlist_insert_end(dlist, d_el);
|
||||
}
|
||||
|
||||
void _dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend) {
|
||||
dlist_el_t *d_el = malloc(sizeof(dlist_el_t));
|
||||
d_el->el_ptr = malloc(el_siz);
|
||||
@@ -58,7 +114,7 @@ void *dlist_it_next(dlist_t *dlist) {
|
||||
if (dlist->pointer->next != NULL) {
|
||||
dlist->pointer = dlist->pointer->next;
|
||||
return dlist->pointer->el_ptr;
|
||||
} else {
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user