Created
October 23, 2012 18:17
-
-
Save blake41/3940474 to your computer and use it in GitHub Desktop.
header file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "list.h" | |
#include "dbg.h" | |
List *List_create() | |
{ | |
return calloc(1, sizeof(List)); | |
} | |
void List_destroy(List *list) | |
{ | |
LIST_FOREACH(list, first, next, cur) { | |
if(cur->prev) { | |
free(cur->prev); | |
} | |
} | |
free(list->last); | |
free(list); | |
} | |
void List_clear(List *list) | |
{ | |
LIST_FOREACH(list, first, next, cur) { | |
free(cur->value); | |
} | |
} | |
void List_clear_destroy(List *list) | |
{ | |
List_clear(list); | |
List_destroy(list); | |
} | |
void List_push(List *list, void *value) | |
{ | |
ListNode *node = calloc(1, sizeof(ListNode)); | |
check_mem(node); | |
node->value = value; | |
if(list->last == NULL) { | |
list->first = node; | |
list->last = node; | |
} else { | |
list->last->next = node; | |
node->prev = list->last; | |
list->last = node; | |
} | |
list->count++; | |
error: | |
return; | |
} | |
void *List_pop(List *list) | |
{ | |
ListNode *node = list->last; | |
return node != NULL ? List_remove(list, node) : NULL; | |
} | |
void List_unshift(List *list, void *value) | |
{ | |
ListNode *node = calloc(1, sizeof(ListNode)); | |
check_mem(node); | |
node->value = value; | |
if(list->first == NULL) { | |
list->first = node; | |
list->last = node; | |
} else { | |
node->next = list->first; | |
list->first->prev = node; | |
list->first = node; | |
} | |
list->count++; | |
error: | |
return; | |
} | |
void *List_shift(List *list) | |
{ | |
ListNode *node = list->first; | |
return node != NULL ? List_remove(list, node) : NULL; | |
} | |
void *List_remove(List *list, ListNode *node) | |
{ | |
void *result = NULL; | |
check(list->first && list->last, "List is empty."); | |
check(node, "node can't be NULL"); | |
if(node == list->first && node == list->last) { | |
list->first = NULL; | |
list->last = NULL; | |
} else if(node == list->first) { | |
list->first = node->next; | |
check(list->first != NULL, "Invalid list, somehow got a first that is NULL"); | |
list->first->prev = NULL; | |
} else if(node == list->last) { | |
list->last = node->prev; | |
check(list->last != NULL, "Invalid list, somehow got a next that is NULL."); | |
list->last->next = NULL; | |
} else { | |
// here we set the pointers to the surrounding nodes to point to the | |
// correct nodes | |
ListNode *after = node->next; | |
ListNode *before = node->prev; | |
after->prev = before; | |
before->next = after; | |
} | |
list->count--; | |
result = node->value; | |
free(node); | |
error: | |
return result; | |
} | |
int main(int argc, char const *argv[]) | |
{ | |
/* code */ | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef lcthw_List_h | |
#define lcthw_List_h | |
#include <stdlib.h> | |
struct ListNode; | |
typedef struct ListNode { | |
struct ListNode *next; | |
struct ListNode *prev; | |
void *value; | |
} ListNode; | |
typedef struct List { | |
int count; | |
ListNode *first; | |
ListNode *last; | |
} List; | |
List *List_create(); | |
void List_destroy(List *list); | |
void List_clear(List *list); | |
void List_clear_destroy(List *list); | |
#define List_count(A) ((A)->count) | |
#define List_first(A) ((A)->first != NULL ? (A)->first->value : NULL) | |
#define List_last(A) ((A)->last != NULL ? (A)->last->value : NULL) | |
void List_push(List *list, void *value); | |
void *List_pop(List *list); | |
void List_unshift(List *list, void *value); | |
void *List_shift(List *list); | |
void *List_remove(List *list, ListNode *node); | |
#define LIST_FOREACH(L, S, M, V) ListNode *_node = NULL;\ | |
ListNode *V = NULL;\ | |
for(V = _node = L->S; _node != NULL; V = _node = _node->M) | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment