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
+56
View File
@@ -19,6 +19,62 @@ dlist_t *_dlist_init(void *el_ptr, int el_siz) {
return dlist; 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) { void _dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend) {
dlist_el_t *d_el = malloc(sizeof(dlist_el_t)); dlist_el_t *d_el = malloc(sizeof(dlist_el_t));
d_el->el_ptr = malloc(el_siz); d_el->el_ptr = malloc(el_siz);
+10 -1
View File
@@ -18,14 +18,23 @@ typedef struct dlist_t {
} dlist_t; } dlist_t;
dlist_t *_dlist_init(void *el_ptr, int el_siz); 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_get_current(dlist_t *dlist);
void *dlist_it_prev(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_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend);
void *dlist_it_prev(dlist_t *dlist); void *dlist_it_prev(dlist_t *dlist);
void *dlist_it_next(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_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_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 #endif
+32
View File
@@ -93,6 +93,37 @@ void test__init__add_and_iterate(void **state) {
assert_memory_equal(dl_t3, &t3, sizeof(test_t)); assert_memory_equal(dl_t3, &t3, sizeof(test_t));
} }
bool _sort(void *_a, void *_b) {
test_t *a = _a;
test_t *b = _b;
return a->num > b->num;
}
void test__init__insert_sort(void **state) {
test_t t1 = {.buf = "TEST BUF", .num = 123, .text = LOREM_IPSUM};
test_t t2 = {.buf = "TEST 1 BUF", .num = 11, .text = "RAND 1 TEXT"};
test_t t3 = {.buf = "TEST 2 BUF", .num = 22, .text = "RAND 2 TEXT"};
test_t t4 = {.buf = "TEST 3 BUF", .num = 23, .text = "RAND 3 TEXT"};
dlist_t *dlist = dlist_init(NULL, test_t);
dlist_insert_sort(dlist, &t1, test_t, _sort);
dlist_insert_sort(dlist, &t2, test_t, _sort);
dlist_insert_sort(dlist, &t3, test_t, _sort);
dlist_insert_sort(dlist, &t4, test_t, _sort);
test_t *dl_t1 = dlist_get_current(dlist);
test_t *dl_t4 = dlist_it_prev(dlist);
test_t *dl_t3 = dlist_it_prev(dlist);
test_t *dl_t2 = dlist_it_prev(dlist);
assert_memory_equal(dl_t1, &t1, sizeof(test_t));
assert_memory_equal(dl_t2, &t2, sizeof(test_t));
assert_memory_equal(dl_t3, &t3, sizeof(test_t));
assert_memory_equal(dl_t4, &t4, sizeof(test_t));
}
int setup(void **state) { return 0; } int setup(void **state) { return 0; }
int tear_down(void **state) { return 0; } int tear_down(void **state) { return 0; }
@@ -102,6 +133,7 @@ int main(int argc, char **argv) {
cmocka_unit_test(test__init__add_several_times), cmocka_unit_test(test__init__add_several_times),
cmocka_unit_test(test__init__add_several_times_prepend), cmocka_unit_test(test__init__add_several_times_prepend),
cmocka_unit_test(test__init__add_and_iterate), cmocka_unit_test(test__init__add_and_iterate),
cmocka_unit_test(test__init__insert_sort),
}; };