--- /dev/null
+#include <stdlib.h>
+#include "list.h"
+
+list* create() {
+ list * l = malloc(sizeof(list));
+ l->first = l->last = NULL;
+ return l;
+}
+
+void insertBegin(list* l, Item i) {
+ link n = malloc(sizeof(struct node));
+ n->item = newItem(i);
+ n->next = l->first;
+ n->prev = NULL;
+
+ if (l->first) l->first->prev = n;
+ else l->last = n;
+
+ l->first = n;
+}
+
+void insertEnd(list* l, Item i) {
+ link n = malloc(sizeof(struct node));
+ n->item = newItem(i);
+ n->next = NULL;
+ n->prev = l->last;
+
+ if (l->last) l->last->next = n;
+ else l->first = n;
+
+ l->last = n;
+}
+
+void insertSorted(list* l, Item i) {
+ link n, iter;
+
+ for (iter = l->first; iter && itemCompare(iter->item, i) < 0; iter = iter->next);
+
+ n = malloc(sizeof(struct node));
+ n->item = newItem(i);
+
+ n->next = iter;
+
+
+ if (iter) {
+ n->prev = iter->prev;
+
+ if (iter->prev) iter->prev->next = n;
+ else l->first = n;
+
+ iter->prev = n;
+
+ } else {
+ n->prev = l->last;
+
+ if (l->last) l->last->next = n;
+ else l->first = n;
+
+ l->last = n;
+ }
+}
+
+void show(list* l) {
+ link iter;
+ for (iter = l->first; iter; iter = iter->next)
+ showItem(iter->item);
+}
+
+void clear(list* l) {
+ link tofree;
+
+ while (l->first) {
+ tofree = l->first;
+ l->first = l->first->next;
+ deleteItem(tofree->item);
+ free(tofree);
+ }
+
+ free(l);
+}
+
+void removeFirst(list* l, Item i) {
+ link iter = l->first;
+ int cmp;
+
+ /* Assumindo que esta' ordeando. */
+ for (; iter && (cmp = itemCompare(iter->item, i)) < 0; iter = iter->next);
+
+ if (iter && !cmp) {
+
+ if (iter->prev) iter->prev->next = iter->next;
+ else l->first = iter->next;
+
+ if (iter->next) iter->next->prev = iter->prev;
+ else l->last = iter->prev;
+
+ deleteItem(iter->item);
+ free(iter);
+ }
+}
+
+void removeAll(list* l, Item i) {
+ link iter = l->first, tofree;
+ int cmp;
+
+ /* Assumindo que esta' ordeando. */
+ while (iter && (cmp = itemCompare(iter->item, i)) <= 0) {
+
+ if (!cmp) {
+
+ if (iter->prev) iter->prev->next = iter->next;
+ else l->first = iter->next;
+
+ if (iter->next) iter->next->prev = iter->prev;
+ else l->last = iter->prev;
+
+ tofree = iter;
+ iter = iter->next;
+
+ deleteItem(tofree->item);
+ free(tofree);
+
+ } else
+ iter = iter->next;
+ }
+}
+
--- /dev/null
+#ifndef LIST_H
+#define LIST_H
+
+#include "item.h"
+
+typedef struct node *link;
+
+struct node {
+ Item item;
+ link next;
+ link prev;
+};
+
+typedef struct {
+ link first;
+ link last;
+} list;
+
+list* create();
+void insertBegin(list* l, Item i);
+void insertEnd(list* l, Item i);
+void insertSorted(list* l, Item i);
+void show(list* l);
+void clear(list* l);
+void removeFirst(list* l, Item i);
+void removeAll(list* l, Item i);
+
+#endif /* LIST_H */