C实现的双向链表

源代码

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;inext;
		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);
}
Leave a comment

0 Comments.

Leave a Reply


[ Ctrl + Enter ]