-
Notifications
You must be signed in to change notification settings - Fork 0
/
listman.cpp
executable file
·104 lines (86 loc) · 2.05 KB
/
listman.cpp
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
#include <stdio.h>
#include <stdlib.h>
#include "utilities.h"
#include "listman.h"
listman::listman() {
numElements = 0;
anchor.prev = NULL;
anchor.next = NULL;
anchor.data = NULL;
}
long int listman::length() {
return numElements;
}
int listman::isEmpty() {
return (numElements == 0)?1:0;
}
listElement * listman::first() {
return anchor.next;
}
listElement * listman::last() {
return anchor.prev;
}
listElement * listman::next(listElement *current) {
if(numElements <= 1) return NULL;
return current->next;
}
listElement * listman::prev(listElement *current) {
if(numElements <= 1) return NULL;
return current->prev;
}
int listman::insertBefore(listElement *position, void *datapoint) {
listElement *newElem = (listElement *)malloc(sizeof(listElement));
newElem->data = datapoint;
if(numElements == 0) {
anchor.prev = anchor.next = newElem;
newElem.prev = newElem.next = &anchor;
}
else {
newElem->prev = position->prev;
newElem->next = position;
position->prev->next = newElem;
position->prev = newElem;
}
numElements++;
return TRUE;
}
int listman::insertAfter(listElement *position, void *datapoint) {
listElement *newElem = (listElement *)malloc(sizeof(listElement));
newElem->data = datapoint;
if(numElements == 0) {
anchor.prev = anchor.next = newElem;
newElem.prev = newElem.next = &anchor;
}
else {
newElem->next = position->next;
newElem->prev = position;
(position->next)->prev = newElem;
position->next = newElem;
}
numElements++;
return TRUE;
}
int listman::append(void *datapoint) {
return insertAfter(last(),datapoint);
}
int listman::prepend(void *datapoint) {
return insertBefore(first(),datapoint);
}
void listman::unlink(listElement *delElem) {
if(!isEmpty) {
(delElem->prev)->next = delElem->next;
(delElem->next)->prev = delElem->prev;
numElements--;
free(delElem);
}
delElem = NULL;
}
void listman::unlinkAll() {
listElement *delElem;
while (!isEmpty) {
unlink(first());
}
}
listman::~listman() {
unlinkAll();
}