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>

Leave a comment

Your comment