summaryrefslogtreecommitdiff
path: root/list.c
blob: c50915265b6a2b5c36fa1e92242dd1e91199fe92 (plain)
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 <sys/queue.h>
#include <stdio.h>
#include <stdlib.h>
#include <err.h>

/*
 * list macro usage examples by Peter Werner <peterw@ifost.org.au>
 *
 * please see http://www.ifost.org.au/~peterw/queue.html for more info
 */

/*
 * our struct definition, with the list element to be referenced by f_link
 */

struct foo {
	int 	f_a;
	char 	f_b;
	LIST_ENTRY(foo) f_link;
};

/*
 * the head of our list of struct foo's (see the manpage for more info)
 */
LIST_HEAD(listhead, foo) list;

struct foo *alloc_foo(int a, char b);

int
main(void)
{
	struct foo *fp, *other;
	struct listhead *listp;

	LIST_INIT(&list);
	listp = &list;

	/*
	 * insert the elements, note the use of the f_link item
	 */
	fp = alloc_foo(1, 'a');
	LIST_INSERT_HEAD(listp, fp, f_link);

	other = alloc_foo(2, 'b');
	LIST_INSERT_AFTER(fp, other, f_link);

	fp = alloc_foo(3, 'c');
	LIST_INSERT_BEFORE(other, fp, f_link);

	/*
 	 * loop through the list
	 */
	LIST_FOREACH(fp, listp, f_link)
		printf("%d %c\n", fp->f_a, fp->f_b);

	/*
	 * free up our list 
	 */
	for (fp = LIST_FIRST(listp); fp != LIST_END(listp); fp = other) {
		other = LIST_NEXT(fp, f_link);
		LIST_REMOVE(fp, f_link);
		free(fp);
	}

	/*
	 * make sure
	 */
	if (LIST_EMPTY(listp))
		printf("List is empty!\n");
	else
		printf("List not empty!\n");

	return(0);
}

struct foo *
alloc_foo(int a, char b)
{
	struct foo *tmp;

	tmp = (struct foo *)malloc(sizeof(struct foo));
	if (tmp == NULL)
		err(1, "malloc");

	tmp->f_a = a;
	tmp->f_b = b;
	return(tmp);
}