This repository has been archived by the owner on Jun 30, 2022. It is now read-only.
/
dll.c
119 lines (91 loc) · 2.55 KB
/
dll.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "dll.h"
#ifndef NULL
#define NULL (void *) 0
#endif
struct dll {
struct dll *prev, *next;
};
int dllAppend (void *list, void *element) {
struct dll *_list, *_element;
_list = (struct dll *) list;
_element = (struct dll *) element;
if ((_list->prev == NULL) && (_list->next == NULL)) {
_element->prev = _element->next = NULL;
_list->prev = _list->next = _element;
} else if ((_list->prev != NULL) && (_list->next != NULL)) {
_element->prev = _list->prev;
_element->next = NULL;
_list->prev->next = _element;
_list->prev = _element;
} else {
return (-1);
}
return (0);
}
int dllPrepend (void *list, void *element) {
struct dll *_list, *_element;
_list = (struct dll *) list;
_element = (struct dll *) element;
if ((_list->prev == NULL) && (_list->next == NULL)) {
_element->prev = _element->next = NULL;
_list->prev = _list->next = element;
} else if ((_list->prev != NULL) && (_list->next != NULL)) {
_element->prev = NULL;
_element->next = _list->next;
_list->next->prev = _element;
_list->next = _element;
} else {
return (-1);
}
return (0);
}
int dllInsert (void *list, void *after, void *element) {
struct dll *_after, *_element;
_after = (struct dll *) after;
_element = (struct dll *) element;
if (_after->next == NULL) {
_element->prev = _after;
_element->next = NULL;
_after->next = _element;
} else {
_element->prev = _after;
_element->next = _after->next;
_after->next->prev = _element;
_after->next = _element;
}
return (0);
}
int dllRemove (void *list, void *element) {
struct dll *_list, *_element;
_list = (struct dll *) list;
_element = (struct dll *) element;
if ((_element->prev == NULL) && (_element->next == NULL)) {
_list->prev = _list->next = NULL;
} else if (_element->prev == NULL) {
_list->next = _element->next;
_element->next->prev = NULL;
} else if (_element->next == NULL) {
_list->prev = _element->prev;
_element->prev->next = NULL;
} else {
_element->prev->next = _element->next;
_element->next->prev = _element->prev;
}
return (0);
}
int dllRemoveFirst (void *list) {
struct dll *_list;
_list = (struct dll *) list;
if ((_list->prev != NULL) && (_list->next != NULL)) {
return (dllRemove (_list, _list->next));
}
return (0);
}
int dllRemoveLast (void *list) {
struct dll *_list;
_list = (struct dll *) list;
if ((_list->prev != NULL) && (_list->next != NULL)) {
return (dllRemove (_list, _list->prev));
}
return (0);
}