C实现的双向链表
源代码
list.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #ifndef __LIST_H__ #define __LIST_H__ typedef struct list_node { struct list_node *prv; struct list_node *next; void *data; } list_node_t; typedef struct { list_node_t *first; list_node_t *last; int size; } list_t; int list_init(list_t **list); int list_add(list_t *list, void *data); void *list_get(list_t *list, int index); int list_remove(list_t *list, int index, void (*data_free) (void *)); void list_free(list_t *list, void (*data_free) (void *)); #endif /* __LIST_H__ */ |
list.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include <stdlib .h> #include <string .h> #include \"list.h\" int list_init(list_t **list) { if(*list == NULL) *list = (list_t *)malloc(sizeof(list_t)); memset(*list, 0, sizeof(list_t)); } int list_add(list_t *list, void *data) { list_node_t *node; node = (list_node_t *)malloc(sizeof(list_node_t)); memset(node, 0, sizeof(list_node_t)); node->data = data; node->prv = list->last; if(list->size == 0) { list->first = list->last = node; } else { node->prv = list->last; list->last->next = node; list->last = node; } return list->size++; } void *list_get(list_t *list, int index) { int i; list_node_t *p; if(index < 0 || index >= list->size) return NULL; p = list->first; for(i =0;i<index ;i++) p = p->next; return p; } int list_remove(list_t *list, int index, void (*data_free) (void *)) { list_node_t *p; int i; if(index < 0 || index >= list->size) return -1; if(index == 0) /* remove first node*/ { p = list->first; list->first = p->next; list->first->prv = NULL; } else if(index == list->size-1) { /* remove last node */ p = list->last; list->last = p->prv; list->last->next = NULL; } else { p = list->first; for(i =0;i</index><index ;i++) p = p->next; p->prv->next = p->next; p->next->prv = p->prv; } list->size--; data_free(p->prv->data); free(p); return 0; } void list_free(list_t *list, void (*data_free) (void *)) { list_node_t *p; list_node_t *c; p = list->last; while(p) { c = p; p = p->prv; data_free(c->data); free(c); } free(list); } </index></string></stdlib> |

