Ticket #101: test-0010.c

File test-0010.c, 1.5 KB (added by Kamil Dudka, 4 years ago)

test-0010.c

Line 
1#include <stdlib.h>
2
3#define DLL_NEW(type) \
4    ((type *) malloc(sizeof(type)))
5
6typedef struct sll_item sll_item_t;
7struct sll_item {
8    sll_item_t *next;
9};
10
11static sll_item_t* create_item(sll_item_t *list)
12{
13    sll_item_t *item = DLL_NEW(sll_item_t);
14    if (!item)
15        abort();
16
17    item->next = (list)
18        ? list
19        : item;
20
21    return item;
22}
23
24static sll_item_t** insert_item(sll_item_t **plist)
25{
26    if (*plist) {
27        sll_item_t *list = *plist;
28        list->next = create_item(list->next);
29    } else {
30        *plist = create_item(NULL);
31    }
32
33    return plist;
34}
35
36static void destroy_cyclic_sll(sll_item_t **plist)
37{
38    sll_item_t *list = *plist;
39    if (list) {
40        sll_item_t *item = list->next;
41        while (item != list) {
42            sll_item_t *next = item->next;
43            // This triggers a memory leak!
44#if 0
45            free(item);
46#endif
47            item = next;
48        }
49        free(list);
50    }
51    *plist = NULL;
52}
53
54int main()
55{
56    sll_item_t *list = create_item(NULL);
57    destroy_cyclic_sll(&list);
58    destroy_cyclic_sll(&list);
59    insert_item(insert_item(&list));
60    destroy_cyclic_sll(&list);
61
62    {
63        insert_item(&list);
64        insert_item(&list);
65        insert_item(&list);
66        insert_item(&list);
67        insert_item(&list);
68        insert_item(&list);
69        insert_item(&list);
70        insert_item(&list);
71        insert_item(&list);
72        insert_item(&list);
73
74        destroy_cyclic_sll(&list);
75    }
76
77    return 0;
78}