linked list
载入中...
搜索中...
未找到
DoubleLink.h
1#ifndef DOUBLE_LINK_HXX
2#define DOUBLE_LINK_HXX
3
4#include <iostream>
5using namespace std;
9template<class T>
10struct DNode
11{
12public:
13 T value;
14 DNode *prev;
15 DNode *next;
16public:
17 DNode() { }
18 DNode(T t, DNode *prev, DNode *next) {
19 this->value = t;
20 this->prev = prev;
21 this->next = next;
22 }
23};
34template<class T>
35class DoubleLink
36{
37public:
38 DoubleLink();
39 ~DoubleLink();
40
41 int size();
42 bool isEmpty();
43
44 T get(unsigned int index);
45 T getFirst();
46 T getLast();
47 DNode<T>* findNode(T t);
48 void traversal();//traverse and print
49
50 int insert(unsigned int index, T t);
51 int insertFirst(T t);
52 int appendLast(T t);
53
54 int del(unsigned int index,T* value);
55 int del(unsigned int index);
56 int deleteFirst(T* value);
57 int deleteFirst();
58 int deleteLast(T* value);
59 int deleteLast();
60 int deleteByValue(T value);
61
62protected:
63 unsigned int count;
64 DNode<T> *phead;
65 int removeNode(DNode<T>* node);
66 //int removeNode();
67 int insertNodeFirst(DNode<T>* node);
68 //int insertNodeFirst();
69private:
70 DNode<T> *getNode(unsigned int index);
71};
75template<class T>
76DoubleLink<T>::DoubleLink() : count(0)
77{
78 // create the head, attention: this is no data in head.
79 phead = new DNode<T>();
80 phead->prev = phead->next = phead;
81 //
82 //count = 0;
83}
84
85// the destructor
86template<class T>
87DoubleLink<T>::~DoubleLink()
88{
89 // delete all nodes
91 DNode<T>* pnode = phead->next;
92 while (pnode != phead)
93 {
94 ptmp = pnode;
95 pnode = pnode->next;
96 delete ptmp;
97 }
98
99 // delete the head
100 delete phead;
101 phead = NULL;
102}
106template<class T>
107DNode<T>* DoubleLink<T>::findNode(T t) {
108 DNode<T>* pnode = phead->next;
110 while (pnode != phead) {
111 if (pnode->value == t) {
112 findNode = pnode;
113 break;
114 }
115 pnode = pnode->next;
116 }
117 return findNode;
118}
122template<class T>
123void DoubleLink<T>::traversal() {
124 DNode<T>* pnode = phead->next;
125 while (pnode != phead)
126 {
127 cout << pnode->value << ends;
128 pnode = pnode->next;
129 }
130 cout << endl;
131}
132
136template<class T>
137int DoubleLink<T>::size()
138{
139 return count;
140}
141
145template<class T>
146bool DoubleLink<T>::isEmpty()
147{
148 return count == 0;
149}
150
154template<class T>
155DNode<T>* DoubleLink<T>::getNode(unsigned int index)
156{
157 // check if the paramerter is valid
159 {
160 cout << "get node failed! the index in out of bound!" << endl;
161 return NULL;
162 }
163 if (index == 0) {
164 return phead->next;
165 }
166 if (index == count - 1) {
167 return phead->prev;
168 }
169
170 // top half, search from begin
171 if (index <= count / 2)
172 {
173 unsigned int i = 0;
174 DNode<T>* pindex = phead->next;
175 while (i++ < index) {//i == index-1, end
176 pindex = pindex->next;
177 }
178
179 return pindex;
180 }
181
182 // bottom half, search from tail
183 int j = 0;
184 int rindex = count - index - 1;
185 DNode<T>* prindex = phead->prev;//the tail node
186 while (j++ < rindex) {
187 prindex = prindex->prev;
188 }
189
190 return prindex;
191}
192
196template<class T>
197T DoubleLink<T>::get(unsigned int index)
198{
199 return getNode(index)->value;
200}
201
205template<class T>
206T DoubleLink<T>::getFirst()
207{
208 return getNode(0)->value;
209}
210
214template<class T>
215T DoubleLink<T>::getLast()
216{
217 return getNode(count - 1)->value;
218}
219
223template<class T>
224int DoubleLink<T>::insert(unsigned int index, T t)
225{
226 if (index == 0)
227 return insertFirst(t);
228
229 DNode<T>* pindex = getNode(index);
230 DNode<T>* pnode = new DNode<T>(t, pindex->prev, pindex);
231 pindex->prev->next = pnode;
232 pindex->prev = pnode;
233 count++;
234
235 return 0;
236}
240template<class T>
241int DoubleLink<T>::insertNodeFirst(DNode<T>* pnode) {
242 phead->next->prev = pnode;
243 phead->next = pnode;
244 return 0;
245}
246
250template<class T>
251int DoubleLink<T>::insertFirst(T t)
252{
253 DNode<T>* pnode = new DNode<T>(t, phead, phead->next);
255 count++;
256
257 return 0;
258}
259
263template<class T>
264int DoubleLink<T>::appendLast(T t)
265{
266 DNode<T>* pnode = new DNode<T>(t, phead->prev, phead);
267 phead->prev->next = pnode;
268 phead->prev = pnode;
269 count++;
270
271 return 0;
272}
273
277template<class T>
278int DoubleLink<T>::removeNode(DNode<T>* node) {
279 node->next->prev = node->prev;
280 node->prev->next = node->next;
281 count--;
282 return 0;
283}
284
288template<class T>
289int DoubleLink<T>::del(unsigned int index,T* value)
290{
292 {
293 cout << "get node failed! the index in out of bound!" << endl;
294 return 1;
295 }
296 DNode<T>* pindex = getNode(index);
297 if (value != NULL) {
298 *value = pindex->value;
299 }
301 delete pindex;
302 return 0;
303}
304
308template<class T>
309int DoubleLink<T>::del(unsigned int index)
310{
311 return del(index, NULL);
312}
313
317template<class T>
318int DoubleLink<T>::deleteFirst(T* value)
319{
320 return del(0,value);
321}
322
326template<class T>
327int DoubleLink<T>::deleteFirst()
328{
329 return del(0, NULL);
330}
331
335template<class T>
336int DoubleLink<T>::deleteLast(T* value)
337{
338 return del(count - 1,value);
339}
340
344template<class T>
345int DoubleLink<T>::deleteLast()
346{
347 return del(count - 1, NULL);
348}
349
354template<class T>
355int DoubleLink<T>::deleteByValue(T value)
356{
357 DNode<T>* node = this->findNode(value);
358 if (node != NULL) {
359 this->removeNode(node);
360 return 1;
361 }
362 return 0;
363}
364
365#endif
Definition DoubleLink.h:11