-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathPointerList.h
More file actions
155 lines (116 loc) · 2.94 KB
/
PointerList.h
File metadata and controls
155 lines (116 loc) · 2.94 KB
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#ifndef PTRLIST_H_
#define PTRLIST_H_
//
// cmplx' simple PointerList
//
template <class T> struct Element {
T* ptr = nullptr;
Element<T>* next = nullptr;
};
template <class T> class PointerList {
private:
size_t len = 0;
Element<T>* firstElement = new Element<T>();
public:
// get length of list
size_t length() { return len; }
// clear list and delete contained pointers
void clear() { for (size_t i = 0; i <= len; i++) delete pop(); }
// check if list contains pointer
bool contains(T* val) { return index_of(val) == -1 ? false : true; }
// appends pointer to the list
void append(T* val) {
Element<T>* cur = firstElement;
while (cur->next != nullptr) cur = cur->next;
cur->next = new Element<T>();
cur->ptr = val;
len++;
}
// pushes pointer on top of the list
void push(T* val) {
firstElement->next = new Element<T>(*firstElement);
firstElement->ptr = val;
len++;
}
// pops first element off the list
// returns popped element pointer.
T* pop() {
if (firstElement->next == nullptr) return nullptr;
Element<T>* top = firstElement;
T* ptr = top->ptr;
firstElement = top->next;
delete top;
len--;
return ptr;
}
// removes first element from the list
// returns removed element pointer.
T* remove_last() {
if (firstElement->next == nullptr) return nullptr;
Element<T>* cur = firstElement;
while (cur->next->next != nullptr) cur = cur->next;
T* ptr = cur->ptr;
cur->ptr = nullptr;
delete cur->next;
cur->next = nullptr;
len--;
return ptr;
}
// removes nth element from the list
// returns removed element pointer.
T* remove(size_t n) {
if (n + 1 > len) return nullptr;
Element<T>* cur = firstElement;
for (size_t i = 0; i < n; i++) cur = cur->next;
T* ptr = cur->ptr;
Element<T>* trgt = cur->next;
cur->ptr = trgt->ptr;
cur->next = trgt->next;
delete trgt;
len--;
return ptr;
}
// gets the nth element from the list
// returns element pointer.
T* get(size_t n) {
if (n + 1 > len) return nullptr;
Element<T>* cur = firstElement;
for (size_t i = 0; i < n; i++) cur = cur->next;
return cur->ptr;
}
// sets nth element
// returns true on success.
bool set(int n, T* val) {
if (n + 1 > len) return false;
Element<T>* cur = firstElement;
for (size_t i = 0; i < n; i++) cur = cur->next;
delete cur->ptr;
cur->ptr = val;
return true;
}
// returns index of element if found
int index_of(T* val) {
if (len == 0) return -1;
Element<T>* cur = firstElement;
size_t index = 0;
while (cur->ptr != val) {
if (cur->next->next == nullptr) return -1;
cur = cur->next;
index++;
}
return index;
}
// swaps n1 with n2
bool swap(int n1, int n2) {
if (n1 + 1 > len || n2 + 1 > len) return false;
Element<T>* e1 = firstElement;
for (size_t i = 0; i < n1; i++) e1 = e1->next;
Element<T>* e2 = firstElement;
for (size_t i = 0; i < n2; i++) e2 = e2->next;
T* temp = e1->ptr;
e1->ptr = e2->ptr;
e2->ptr = temp;
return true;
}
};
#endif