LinkList class 实现
LinkList.h
LinkList.cpp
测试main.cpp
1 #ifndef LINKLIST_H
2 #define LINKLIST_H
3
4
5
6 template <typename Type> class Node
7 {
8 //friend class LinkList;
9 public:
10 Node();
11 Node(const Type &item);
12 ~Node();
13 //Node<Type> * next() const { return m_next; }
14 //Type data() const { return m_data; }
15
16 void insertAfter(Node<Type> *p);
17 Type removeAfter();
18
19 //private:
20 Type data;
21 Node<Type> *next;
22 };
23
24 /* This link list include a head node, this node is not the first node
25 * of this list. The first node of list should be *(head->next).
26 * We can know if this list is null conveniently by compare (head->next == 0).
27 */
28 template <typename Type> class LinkList
29 {
30 public:
31 LinkList();
32 LinkList(const Type &val);
33 ~LinkList();
34
35 int length();
36 bool empty(){ return head->next == NULL; }
37 Node<Type> *getHead(){ return head; }
38 Type getElem(int i);
39 Type operator[](int i);
40
41 void makeEmpty();
42 Node<Type> *search(Type val);
43 Node<Type> *find(int i);
44
45
46 int insert(int i, Type val);
47 Type remove(int i);
48
49 void push_back(const Type &val);
50 Type pop_back();
51 void visit();
52
53
54 private:
55 Node<Type> *head;
56
57 };
58
59 #include "LinkList.cpp"
60
61
62
63 #endif
2 #define LINKLIST_H
3
4
5
6 template <typename Type> class Node
7 {
8 //friend class LinkList;
9 public:
10 Node();
11 Node(const Type &item);
12 ~Node();
13 //Node<Type> * next() const { return m_next; }
14 //Type data() const { return m_data; }
15
16 void insertAfter(Node<Type> *p);
17 Type removeAfter();
18
19 //private:
20 Type data;
21 Node<Type> *next;
22 };
23
24 /* This link list include a head node, this node is not the first node
25 * of this list. The first node of list should be *(head->next).
26 * We can know if this list is null conveniently by compare (head->next == 0).
27 */
28 template <typename Type> class LinkList
29 {
30 public:
31 LinkList();
32 LinkList(const Type &val);
33 ~LinkList();
34
35 int length();
36 bool empty(){ return head->next == NULL; }
37 Node<Type> *getHead(){ return head; }
38 Type getElem(int i);
39 Type operator[](int i);
40
41 void makeEmpty();
42 Node<Type> *search(Type val);
43 Node<Type> *find(int i);
44
45
46 int insert(int i, Type val);
47 Type remove(int i);
48
49 void push_back(const Type &val);
50 Type pop_back();
51 void visit();
52
53
54 private:
55 Node<Type> *head;
56
57 };
58
59 #include "LinkList.cpp"
60
61
62
63 #endif
LinkList.cpp
1 //for Node class implement
2 ////////////////////////////////////////////////////////////////////////////////////
3 template <typename Type> Node<Type>::Node() : next(NULL)
4 {
5 }
6
7 template <typename Type> Node<Type>::Node(const Type &data) : data(data), next(NULL)
8 {
9 }
10
11 template <typename Type> Node<Type>::~Node()
12 {
13 }
14
15 template <typename Type> void Node<Type>::insertAfter(Node<Type> *p)
16 {
17 p->next = next;
18 next = p;
19 }
20
21 template <typename Type> Type Node<Type>::removeAfter()
22 {
23 Node<Type> *ptr;
24 Type val;
25 if(next == NULL) return NULL;
26
27 ptr = next;
28 next = ptr->next;
29 val = ptr->data;
30 delete ptr;
31
32 return val;
33 }
34
35
36 //for LinkList class implement
37 ///////////////////////////////////////////////////////////////////////////////////
38
39
40 template <typename Type> LinkList<Type>::LinkList()
41 {
42 head = new Node<Type>();//create a head node
43 }
44
45 template <typename Type> LinkList<Type>::LinkList(const Type &val)
46 {
47 head = new Node<Type>(val);
48 }
49
50 template <typename Type> LinkList<Type>::~LinkList()//no implement
51 {
52 makeEmpty();
53 delete head;
54 }
55
56 template <typename Type> int LinkList<Type>::length()
57 {
58 int i = 0;
59 Node<Type> *ptr = head;
60 while(ptr->next != NULL)
61 {
62 ptr = ptr->next;
63 i++;
64 }
65
66 return i;
67 }
68
69 template <typename Type> Type LinkList<Type>::getElem(int i)
70 {
71 if(i < 0 || i >= length())
72 {
73 cerr << "Invailed index: getElem(int i)\n";
74 exit(-1);
75 }
76
77 Node<Type> *ptr = head->next;
78 int j;
79
80 for(j = 0; j < i; j++)
81 {
82 ptr = ptr->next;
83 }
84
85 return ptr->data;
86
87 }
88
89
90 template <typename Type> void LinkList<Type>::makeEmpty()
91 {
92 if(empty())
93 return;
94
95 Node<Type> *ptr;
96 while(head->next != NULL)
97 {
98 ptr = head->next;
99 head->next = ptr->next;
100 delete ptr;
101 }
102
103 }
104
105 template <typename Type> Node<Type> * LinkList<Type>::search(Type val)
106 {
107 Node<Type> *ptr = head->next;
108
109 while(ptr != NULL && ptr->data != val)
110 {
111 ptr = ptr->next;
112 }
113
114 return ptr;
115
116
117 }
118
119 template <typename Type> Node<Type> * LinkList<Type>::find(int i)
120 {
121 if(i < 0 || i >= length())
122 {
123 cerr << "Invailed index: find(int i)\n";
124 return NULL;
125 }
126
127 Node<Type> *ptr = head->next;
128 int j;
129
130 for(j = 0; j < i; j++)
131 {
132 ptr = ptr->next;
133 }
134
135 return ptr;
136
137 }
138
139 template <typename Type> int LinkList<Type>::insert(int i, Type val)
140 {
141 if(i < 0 || i >= length())
142 {
143 cerr << "Invailed index: insert(int i, Type val)\n";
144 exit(-1);
145 }
146
147 Node<Type> *ptr;
148 Node<Type> *newNode = new Node<Type>(val);
149
150 ptr = find(i-1);
151 ptr->insertAfter(newNode);
152
153 return 0;
154
155 }
156
157
158 template <typename Type> Type LinkList<Type>::remove(int i)
159 {
160 if(i < 0 || i >= length())
161 {
162 cerr << "Invailed index: remove(int i)\n";
163 exit(-1);
164 }
165
166 Node<Type> *ptr;
167
168 ptr = find(i-1);
169 return ptr->removeAfter();
170
171 }
172
173
174 template <typename Type> void LinkList<Type>::push_back(const Type &val)
175 {
176 Node<Type> *newNode = new Node<Type>(val);
177 Node<Type> *ptr = head;
178
179 if(empty())
180 {
181 ptr->insertAfter(newNode);
182 return;
183 }
184
185 ptr = find(length() - 1);
186 ptr->insertAfter(newNode);
187
188 }
189
190 template <typename Type> Type LinkList<Type>::pop_back()
191 {
192 if(empty())
193 {
194 cerr << "Empty, no element to pop: pop_back()\n";
195 exit(-1);
196 }
197
198 Node<Type> *ptr = find(length() - 2);
199 return ptr->removeAfter();
200 }
201
202
203 template <typename Type> void LinkList<Type>::visit()
204 {
205 Node<Type> *ptr = head->next;
206 while(ptr != NULL)
207 {
208 cout << ptr->data << " ";
209 ptr = ptr->next;
210 }
211 cout << "\n";
212 }
213
214 template <typename Type> Type LinkList<Type>::operator[](int i)
215 {
216 return getElem(i);
217 }
2 ////////////////////////////////////////////////////////////////////////////////////
3 template <typename Type> Node<Type>::Node() : next(NULL)
4 {
5 }
6
7 template <typename Type> Node<Type>::Node(const Type &data) : data(data), next(NULL)
8 {
9 }
10
11 template <typename Type> Node<Type>::~Node()
12 {
13 }
14
15 template <typename Type> void Node<Type>::insertAfter(Node<Type> *p)
16 {
17 p->next = next;
18 next = p;
19 }
20
21 template <typename Type> Type Node<Type>::removeAfter()
22 {
23 Node<Type> *ptr;
24 Type val;
25 if(next == NULL) return NULL;
26
27 ptr = next;
28 next = ptr->next;
29 val = ptr->data;
30 delete ptr;
31
32 return val;
33 }
34
35
36 //for LinkList class implement
37 ///////////////////////////////////////////////////////////////////////////////////
38
39
40 template <typename Type> LinkList<Type>::LinkList()
41 {
42 head = new Node<Type>();//create a head node
43 }
44
45 template <typename Type> LinkList<Type>::LinkList(const Type &val)
46 {
47 head = new Node<Type>(val);
48 }
49
50 template <typename Type> LinkList<Type>::~LinkList()//no implement
51 {
52 makeEmpty();
53 delete head;
54 }
55
56 template <typename Type> int LinkList<Type>::length()
57 {
58 int i = 0;
59 Node<Type> *ptr = head;
60 while(ptr->next != NULL)
61 {
62 ptr = ptr->next;
63 i++;
64 }
65
66 return i;
67 }
68
69 template <typename Type> Type LinkList<Type>::getElem(int i)
70 {
71 if(i < 0 || i >= length())
72 {
73 cerr << "Invailed index: getElem(int i)\n";
74 exit(-1);
75 }
76
77 Node<Type> *ptr = head->next;
78 int j;
79
80 for(j = 0; j < i; j++)
81 {
82 ptr = ptr->next;
83 }
84
85 return ptr->data;
86
87 }
88
89
90 template <typename Type> void LinkList<Type>::makeEmpty()
91 {
92 if(empty())
93 return;
94
95 Node<Type> *ptr;
96 while(head->next != NULL)
97 {
98 ptr = head->next;
99 head->next = ptr->next;
100 delete ptr;
101 }
102
103 }
104
105 template <typename Type> Node<Type> * LinkList<Type>::search(Type val)
106 {
107 Node<Type> *ptr = head->next;
108
109 while(ptr != NULL && ptr->data != val)
110 {
111 ptr = ptr->next;
112 }
113
114 return ptr;
115
116
117 }
118
119 template <typename Type> Node<Type> * LinkList<Type>::find(int i)
120 {
121 if(i < 0 || i >= length())
122 {
123 cerr << "Invailed index: find(int i)\n";
124 return NULL;
125 }
126
127 Node<Type> *ptr = head->next;
128 int j;
129
130 for(j = 0; j < i; j++)
131 {
132 ptr = ptr->next;
133 }
134
135 return ptr;
136
137 }
138
139 template <typename Type> int LinkList<Type>::insert(int i, Type val)
140 {
141 if(i < 0 || i >= length())
142 {
143 cerr << "Invailed index: insert(int i, Type val)\n";
144 exit(-1);
145 }
146
147 Node<Type> *ptr;
148 Node<Type> *newNode = new Node<Type>(val);
149
150 ptr = find(i-1);
151 ptr->insertAfter(newNode);
152
153 return 0;
154
155 }
156
157
158 template <typename Type> Type LinkList<Type>::remove(int i)
159 {
160 if(i < 0 || i >= length())
161 {
162 cerr << "Invailed index: remove(int i)\n";
163 exit(-1);
164 }
165
166 Node<Type> *ptr;
167
168 ptr = find(i-1);
169 return ptr->removeAfter();
170
171 }
172
173
174 template <typename Type> void LinkList<Type>::push_back(const Type &val)
175 {
176 Node<Type> *newNode = new Node<Type>(val);
177 Node<Type> *ptr = head;
178
179 if(empty())
180 {
181 ptr->insertAfter(newNode);
182 return;
183 }
184
185 ptr = find(length() - 1);
186 ptr->insertAfter(newNode);
187
188 }
189
190 template <typename Type> Type LinkList<Type>::pop_back()
191 {
192 if(empty())
193 {
194 cerr << "Empty, no element to pop: pop_back()\n";
195 exit(-1);
196 }
197
198 Node<Type> *ptr = find(length() - 2);
199 return ptr->removeAfter();
200 }
201
202
203 template <typename Type> void LinkList<Type>::visit()
204 {
205 Node<Type> *ptr = head->next;
206 while(ptr != NULL)
207 {
208 cout << ptr->data << " ";
209 ptr = ptr->next;
210 }
211 cout << "\n";
212 }
213
214 template <typename Type> Type LinkList<Type>::operator[](int i)
215 {
216 return getElem(i);
217 }
测试main.cpp
1 #include <iostream>
2 #include <string>
3 #include "LinkList.h"
4 using namespace std;
5
6
7 int main()
8 {
9
10
11 //test for class Node<Type>
12 /*
13 Node<int> *head = new Node<int>(1);
14
15 Node<int> *Node1 = new Node<int>(3);
16 head->insertAfter(Node1);
17
18 Node<int> *Node2 = new Node<int>(6);
19 Node1->insertAfter(Node2);
20
21 Node<int> *ptr = head;
22
23
24 while(ptr != NULL)
25 {
26 cout << ptr->data <<" ";
27 ptr = ptr->next;
28
29 }
30
31 */
32
33
34 ///test for LinkList<int>
35
36 LinkList<int> *L = new LinkList<int>;
37
38 //int val;
39 L->push_back(3);
40 L->push_back(5);
41 L->push_back(8);
42 L->push_back(67);
43 L->push_back(99);
44 L->push_back(158);
45 cout << L->length() << "\n";
46 L->visit();
47
48 L->pop_back();
49 L->visit();
50
51 L->pop_back();
52 L->visit();
53
54 L->insert(2, 22);
55 L->visit();
56
57 L->remove(3);
58 L->visit();
59
60
61 ///test for LinkList<string>
62 LinkList<string> *strL = new LinkList<string>;
63
64 strL->push_back("I");
65 strL->push_back("am");
66 strL->push_back("a");
67 strL->push_back("graduate");
68 strL->push_back("student");
69 strL->push_back("in");
70 strL->push_back("SJTU");
71 cout << strL->length() << "\n";
72 strL->visit();
73
74 strL->pop_back();
75 strL->visit();
76
77 strL->pop_back();
78 strL->visit();
79
80 strL->insert(2, "%%");
81 strL->visit();
82
83 strL->remove(3);
84 strL->visit();
85
86 cout << (*strL)[8];
87
88 return 0;
89
90
91 }
2 #include <string>
3 #include "LinkList.h"
4 using namespace std;
5
6
7 int main()
8 {
9
10
11 //test for class Node<Type>
12 /*
13 Node<int> *head = new Node<int>(1);
14
15 Node<int> *Node1 = new Node<int>(3);
16 head->insertAfter(Node1);
17
18 Node<int> *Node2 = new Node<int>(6);
19 Node1->insertAfter(Node2);
20
21 Node<int> *ptr = head;
22
23
24 while(ptr != NULL)
25 {
26 cout << ptr->data <<" ";
27 ptr = ptr->next;
28
29 }
30
31 */
32
33
34 ///test for LinkList<int>
35
36 LinkList<int> *L = new LinkList<int>;
37
38 //int val;
39 L->push_back(3);
40 L->push_back(5);
41 L->push_back(8);
42 L->push_back(67);
43 L->push_back(99);
44 L->push_back(158);
45 cout << L->length() << "\n";
46 L->visit();
47
48 L->pop_back();
49 L->visit();
50
51 L->pop_back();
52 L->visit();
53
54 L->insert(2, 22);
55 L->visit();
56
57 L->remove(3);
58 L->visit();
59
60
61 ///test for LinkList<string>
62 LinkList<string> *strL = new LinkList<string>;
63
64 strL->push_back("I");
65 strL->push_back("am");
66 strL->push_back("a");
67 strL->push_back("graduate");
68 strL->push_back("student");
69 strL->push_back("in");
70 strL->push_back("SJTU");
71 cout << strL->length() << "\n";
72 strL->visit();
73
74 strL->pop_back();
75 strL->visit();
76
77 strL->pop_back();
78 strL->visit();
79
80 strL->insert(2, "%%");
81 strL->visit();
82
83 strL->remove(3);
84 strL->visit();
85
86 cout << (*strL)[8];
87
88 return 0;
89
90
91 }