源代码
list.h
#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
#include
#include
#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;inext;
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 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);
}
0 Comments.