/* lista.2linkitettytoteutus.c SJ */ /* toteutus */ #include "lista.2linkitettytoteutus.h" #include /* listasolmu */ typedef struct LIST_NODE_RECORD *LIST_NODE; struct LIST_NODE_RECORD { LIST_NODE next; LIST_NODE prev; ELEMENT elem; }; /* tunnussolmu */ struct LIST_RECORD { LIST_NODE first; LIST_NODE last; }; /* listan luonti */ #define LIST_CREATE(L) _LIST_CREATE(&L) void _LIST_CREATE(LIST *L) { (*L) = (LIST)malloc(sizeof(struct LIST_RECORD)); (*L)->first = NULL; (*L)->last = NULL; } void LIST_INSERT(LIST L, LIST_POSITION p, ELEMENT x) { LIST_POSITION q; q = (LIST_NODE)malloc(sizeof(struct LIST_NODE_RECORD)); q->elem = x; if (p != NULL) { /* lisäys muualle kuin loppuun */ q->next = p; /* 4 osoittimen sijoitusta */ q->prev = p->prev; p->prev = q; if (q->prev != NULL) q->prev->next = q; /* ei alkuun*/ else L->first = q; /* lisäys alkuun */ } else { /* lisäys listan loppuun */ q->next = NULL; /* 4 osoittimen sijoitusta */ q->prev = L->last; L->last = q; if (q->prev != NULL) q->prev->next = q; /* lisäys epätyhjään listaan */ else L->first = q; /* lisäys tyhjään listaan */ } } void LIST_DELETE(LIST L, LIST_POSITION p) { /* 4 osoittimen sijoitusta */ if (p->next != NULL) p->next->prev = p->prev; /* muu kuin viimeinen */ else L->last = p->prev; /* viimeinen */ if (p->prev != NULL) p->prev->next = p->next; /* muu kuin ensimmäinen */ else L->first = p->next; /* ensimmäinen */ p->next = NULL; p->prev = NULL; free(p); } ELEMENT LIST_RETRIEVE(LIST L, LIST_POSITION p) { return p->elem; } LIST_POSITION LIST_NEXT(LIST L, LIST_POSITION p) { return p->next; } LIST_POSITION LIST_FIRST(LIST L) { return L->first; } LIST_POSITION LIST_EOL(LIST L) { return NULL; }