void klist_init(klist *self) { self->head = klist_node_new(NULL); self->head->next = self->tail; self->head->prev = self->head; self->tail = klist_node_new(NULL); self->tail->prev = self->head; self->tail->next = self->tail; self->length = 0; }
void klist_append(klist *self, void *data) { struct klist_node *node = klist_node_new(data); node->prev = self->tail->prev; node->next = self->tail; self->tail->prev->next = node; self->tail->prev = node; self->length++; }
void klist_prepend(klist *self, void *data) { struct klist_node *node = klist_node_new(data); node->next = self->head->next; node->prev = self->head; self->head->next->prev = node; self->head->next = node; self->length++; }
void klist_append(klist l, const char* s) { struct klist_node* newnode = klist_node_new(s); if (l->tail == NULL) { VIS_ASSERT(klist_empty(l)); l->head = l->tail = newnode; } else { VIS_ASSERT(!klist_empty(l)); newnode->prev = l->tail; l->tail->next = newnode; l->tail = newnode; } l->length += 1; }
static int klist_iter_insert_after(kiter *iter, void *el) { struct klist_iter *self = (struct klist_iter *)iter; struct klist_node *node; if (self->node == self->list->tail) { return -1; } node = klist_node_new(el); node->prev = self->node; node->next = self->node->next; node->prev->next = node; node->next->prev = node; return 0; }