test dlist

This commit is contained in:
2026-07-30 17:04:07 +03:00
parent 7711749d03
commit fc33d521a2
6 changed files with 178 additions and 23 deletions
+22 -21
View File
@@ -4,34 +4,22 @@
#include <stdlib.h>
#include <string.h>
typedef struct dlist_el_t {
struct dlist_el_t *next;
struct dlist_el_t *previous;
void *el_ptr;
} dlist_el_t;
#include "dlist.h"
typedef struct dlist_t {
dlist_el_t *start;
dlist_el_t *current;
size_t len;
} dlist_t;
void dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend);
dlist_t *dlist_init(void *el_ptr, int el_siz) {
dlist_t *_dlist_init(void *el_ptr, int el_siz) {
dlist_t *dlist = malloc(sizeof(dlist_t));
dlist->len = 0;
dlist->current = NULL;
dlist->start = NULL;
if (el_ptr != NULL) {
dlist_add(dlist, el_ptr, el_siz, false);
_dlist_add(dlist, el_ptr, el_siz, false);
}
return 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) {
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);
@@ -41,23 +29,36 @@ void dlist_add(dlist_t *dlist, void *el_ptr, int el_siz, bool prepend) {
d_el->next = NULL;
dlist->start = d_el;
dlist->current = d_el;
dlist->pointer = d_el;
} else if (prepend) {
d_el->previous = NULL;
d_el->next = dlist->start;
dlist->start->previous = d_el;
dlist->start = d_el;
} else {
d_el->previous = dlist->current;
d_el->next = NULL;
dlist->current->next = d_el;
dlist->current = d_el;
dlist->pointer = d_el;
}
dlist->len++;
}
void *dlist_get_current(dlist_t *dlist) {
return dlist->current->el_ptr;
void *dlist_it_prev(dlist_t *dlist) {
if (dlist->pointer->previous != NULL) {
dlist->pointer = dlist->pointer->previous;
return dlist->pointer->el_ptr;
} else {
return NULL;
}
}
void *dlist_it_prev(dlist_t *dlist) {
dlist->current = dlist->current->previous;
return dlist->current;
void *dlist_it_next(dlist_t *dlist) {
if (dlist->pointer->next != NULL) {
dlist->pointer = dlist->pointer->next;
return dlist->pointer->el_ptr;
} else {
return NULL;
}
}