dlist: insert sort [not finished]

This commit is contained in:
2026-07-30 18:38:02 +03:00
parent fc33d521a2
commit a1e1a0a0d3
3 changed files with 99 additions and 2 deletions
+57 -1
View File
@@ -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;
}
}
+10 -1
View File
@@ -18,14 +18,23 @@ typedef struct dlist_t {
} dlist_t;
dlist_t *_dlist_init(void *el_ptr, int el_siz);
/* Returns if a > b */
typedef bool dblist_cb_t(void *a, void *b);
void *dlist_get_current(dlist_t *dlist);
void *dlist_it_prev(dlist_t *dlist);
void _dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend);
void *dlist_it_prev(dlist_t *dlist);
void *dlist_it_next(dlist_t *dlist);
void _dlist_insert_sort(dlist_t *dlist, void *el_ptr, int el_siz,
dblist_cb_t *cb);
#define dlist_init(el_ptr, el_def) _dlist_init(el_ptr, sizeof(el_def))
#define dlist_add(dlist, el_ptr, el_def, prepend) _dlist_add(dlist, el_ptr, sizeof(el_def), prepend)
#define dlist_add(dlist, el_ptr, el_def, prepend) \
_dlist_add(dlist, el_ptr, sizeof(el_def), prepend)
#define dlist_get_current(dlist) dlist->current->el_ptr
#define dlist_insert_sort(dlist, el_ptr, el_typ, cb) \
_dlist_insert_sort(dlist, el_ptr, sizeof(el_typ), cb)
#endif