42#include "lib/dbl-circ-list.h"
50 struct dblcl *previous;
74 for(
this = *dblcl; this->next != *dblcl;
this = this->next);
84 if(*dblcl == NULL || element == NULL) {
92 this->previous->next = this->next;
93 this->next->previous = this->previous;
96 if(*dblcl == element) {
97 *dblcl = this->next ==
this ? NULL : this->next;
101 this->previous = NULL;
107 }
while(
this != *dblcl);
115 if(element == NULL) {
126 ((
struct dblcl *)element)->next = element;
127 ((
struct dblcl *)element)->previous = element;
130 ((
struct dblcl *)element)->next = head;
131 ((
struct dblcl *)element)->previous = head->previous;
132 head->previous->next = element;
133 head->previous = element;
144 if(element == NULL) {
155 ((
struct dblcl *)element)->next = element;
156 ((
struct dblcl *)element)->previous = element;
160 ((
struct dblcl *)element)->next = *dblcl;
161 ((
struct dblcl *)element)->previous = tail;
162 tail->next->previous = element;
163 tail->next = element;
170 if(element == NULL || existing == NULL) {
177 ((
struct dblcl *)element)->next = ((
struct dblcl *)existing)->next;
178 ((
struct dblcl *)element)->previous = existing;
179 ((
struct dblcl *)existing)->next->previous = element;
180 ((
struct dblcl *)existing)->next = element;
186 if(element == NULL || existing == NULL) {
193 ((
struct dblcl *)element)->next = existing;
194 ((
struct dblcl *)element)->previous = ((
struct dblcl *)existing)->previous;
195 ((
struct dblcl *)existing)->previous->next = element;
196 ((
struct dblcl *)existing)->previous = element;
199 if(*dblcl == existing) {
207 unsigned long len = 1;
214 for(
this = *dblcl; this->next != *dblcl;
this = this->next) {
224 return *dblcl == NULL ? true :
false;
void dbl_circ_list_add_before(dbl_circ_list_t dblcl, void *existing, void *element)
Add element to a circular, doubly-linked list before existing element.
void dbl_circ_list_add_head(dbl_circ_list_t dblcl, void *element)
Add an element to the head of a circular, doubly-linked list.
void ** dbl_circ_list_t
The doubly-linked circular list datatype.
void *const * const_dbl_circ_list_t
The non-modifiable doubly-linked circular list type.
bool dbl_circ_list_is_empty(const_dbl_circ_list_t dblcl)
Determine whether a circular, doubly-linked list is empty.
unsigned long dbl_circ_list_length(const_dbl_circ_list_t dblcl)
Get the length of a circular, doubly-linked list.
void dbl_circ_list_remove(dbl_circ_list_t dblcl, const void *element)
Remove an element from a circular, doubly-linked list.
void dbl_circ_list_add_after(dbl_circ_list_t dblcl, void *existing, void *element)
Add element to a circular, doubly-linked list after existing element.
void dbl_circ_list_init(dbl_circ_list_t dblcl)
Initialise a circular, doubly-linked list.
void dbl_circ_list_add_tail(dbl_circ_list_t dblcl, void *element)
Add an element to the tail of a circular, doubly-linked list.
void * dbl_circ_list_head(const_dbl_circ_list_t dblcl)
Return the tail of a circular, doubly-linked list.
void * dbl_circ_list_tail(const_dbl_circ_list_t dblcl)
Return the tail of a circular, doubly-linked list.