#include #include typedef struct node { char Character; struct node *Next; struct node *Prev; }node; // TODO: chane all the function to use a dlinked list node *alloc_node(char c, node *Next, node *Prev) { node *NewNode = malloc(sizeof(node)); NewNode->Character = c; NewNode->Next = Next; NewNode->Prev = Prev; return NewNode; } // NOTE: adds an element to the beginning void list_add(node **Head, char c) { node *NewNode = alloc_node(c, *Head, 0); if(*Head) (*Head)->Prev = NewNode; *Head = NewNode; } // NOTE: inserts after a specific node void list_insert_after(node *Node, char c) { node *NewNode = alloc_node(c, Node->Next, Node); node *Next = Node->Next; if(Next) { Next->Prev = NewNode; } Node->Next = NewNode; } // NOTE: get's a node with the specified character node *list_get(node **Head, char c) { node *Result; for(node *Iter = *Head; Iter; Iter = Iter->Next) { if(Iter->Character == c) { Result = Iter; break; } } return Result; } // NOTE: removes a specific node from the list void list_remove(node **Head, node *Node) { // NOTE: this should get simpler // Find prev node node *Prev = Node->Prev; if(Prev) Prev->Next = Node->Next; node *Next = Node->Next; Next->Prev = Prev; free(Node); } // NOTE: frees the whole list void list_free(node **Head) { for(node *Iter = *Head; Iter; ) { node *ToFree = Iter; Iter = Iter->Next; free(ToFree); } } int main(int argc, char **argv) { node *Head = 0; list_add(&Head, 'c'); list_add(&Head, 'y'); list_add(&Head, 'b'); node *ToBeRemoved = list_get(&Head, 'y'); list_remove(&Head, ToBeRemoved); list_add(&Head, 'a'); node *InsertAfter = list_get(&Head, 'c'); list_insert_after(InsertAfter, 'd'); // NOTE: Prints out the whole list for(node *Iter = Head; Iter; Iter = Iter->Next) { printf("%c ", Iter->Character); } printf("\n"); node *B = list_get(&Head, 'b'); if(B) { printf("%s %c %s\n",B->Prev? B->Prev: "Null", B->Character, B->Next? B->Next: "Null"); } list_free(&Head); }