TableHead类决定使用双向链表,可快速找到其前驱。
实现代码如下
DBLList.h(双向链表类)
Code
1/**//*
2 * 湖南大学软件学院07级5班Debugger小组
3 *
4 * 文件名称:DBLList.h
5 * 功能摘要:数据库双向链表 声明文件
6 *
7 * 作者:卓卓
8 * 创建日期:2009年3月14日
9 * 修改日期:2009年3月25日(添加注释并修复letcnt++bug)
10 */
11#pragma once
12
13#include "DBLinkNode.h"
14#include "DBListADT.h"
15#include <iostream>
16using namespace std;
17
18template <class Type>
19class DBLList:public DBListADT<Type>
20{
21private:
22 DBLinkNode<Type> *head;//头结点
23 DBLinkNode<Type> *tail;//尾节点
24 DBLinkNode<Type> *fence;//当前节点
25 int rightcnt;//右端长度
26 int leftcnt;//左端长度
27 void InitList();//初始化链表
28 void RemoveAll();//清空链表
29public:
30 DBLList(void);
31 DBLList(DBLList& list);
32 ~DBLList(void);
33 bool Insert(const Type& element);//插入
34 void Append(const Type& element);//追加
35 bool Remove();//删除fence的下一节点
36 void SetValue(const Type& element);//设置当前值
37 Type GetValue() const;//返回当前元素的值
38 bool Find(Type& element);//查找元素的位置
39 void Clear();//清空链表
40 bool SetPos(const int& pos);//设置位置
41 bool Prev();//fence向前移动
42 bool Next();//fence向后移动
43 bool IsEmpty() const;//链表是否为空 true为空
44 DBLList& operator=(DBLList& list);
45};
46
47template <class Type>
48DBLList<Type>::DBLList()
49{
50 InitList();//初始化
51}
52
53template <class Type>
54DBLList<Type>::DBLList(DBLList& list)
55{
56 InitList();
57 list.SetPos(0);//fence指向头指针
58 while(list.Next())
59 {
60 Append(list.GetValue());
61 }
62 list.SetPos(0);//fence指向头指针
63}
64
65template <class Type>
66DBLList<Type>::~DBLList()
67{
68 Clear();//清空
69}
70
71/**//*******************************************
72/
73/ 函数: 初始化链表
74/ 说明: 空节点作为表头
75/
76********************************************/
77
78template <class Type>
79void DBLList<Type>::InitList()
80{
81 fence=head=tail=new DBLinkNode<Type>;
82 rightcnt=1;
83 leftcnt=0;
84}
85
86/**//*******************************************
87/
88/ 函数: 插入节点
89/ 说明: 插入到fence指向下一个位置
90/
91********************************************/
92
93template <class Type>
94bool DBLList<Type>::Insert(const Type& element)
95{
96 fence=fence->m_nodeNext=new DBLinkNode<Type>(element,fence,fence->m_nodeNext);
97 if(fence->m_nodeNext!=NULL)
98 {
99 fence->m_nodeNext->m_nodePrev=fence;//若不是尾指针,fence指向的下一节点的前指针域指向fence
100 }
101 else
102 {
103 tail=fence;//如果是尾指针,则改变尾指针指向当前指针
104 }
105 leftcnt++;
106 return true;
107}
108
109/**//*******************************************
110/
111/ 函数: 在表尾追加一个节点
112/
113********************************************/
114
115template <class Type>
116void DBLList<Type>::Append(const Type& element)
117{
118 tail=tail->m_nodeNext=new DBLinkNode<Type>(element,tail,NULL);
119 //tail=fence;不要移动fence指针
120 leftcnt++;
121}
122
123/**//*******************************************
124/
125/ 函数: 设置当前节点的值
126/
127********************************************/
128
129template <class Type>
130void DBLList<Type>::SetValue(const Type& element)
131{
132 fence->m_nodeElement=element;
133}
134
135/**//*******************************************
136/
137/ 函数: 返回当前节点的值
138/
139********************************************/
140
141template <class Type>
142Type DBLList<Type>::GetValue() const
143{
144 return fence->m_nodeElement;
145}
146
147/**//*******************************************
148/
149/ 函数: 查找
150/ 说明: 未完善
151/
152********************************************/
153
154template <class Type>
155bool DBLList<Type>::Find(Type& element)
156{
157 return true;
158}
159/**//*******************************************
160/
161/ 函数: 删除节点
162/ 说明: 删除fence指向的下一个节点
163/ 注意: 空表头不会被删除
164/
165********************************************/
166template <class Type>
167bool DBLList<Type>::Remove()//删除fence下一个节点
168{
169 if(fence->m_nodeNext==NULL)
170 return false;
171 DBLinkNode<Type>* tmp=fence->m_nodeNext;//tmp指向要删除的节点
172 fence->m_nodeNext=tmp->m_nodeNext;
173 if(tmp->m_nodeNext!=0)
174 tmp->m_nodeNext->m_nodePrev=fence;
175 else
176 tail=fence;
177 delete tmp;
178 rightcnt--;
179 return true;
180}
181
182template <class Type>
183void DBLList<Type>::RemoveAll()
184{
185 fence=head;
186 while(fence->m_nodeNext!=tail)//删除最后一个前的节点
187 {
188 Remove();
189 }
190 Remove();//把最后一个节点删除
191 InitList();
192}
193
194/**//*******************************************
195/
196/ 函数: 清空链表
197/ 说明: 移动fence指针
198/ 注意: 空链表返回
199/
200********************************************/
201
202template <class Type>
203void DBLList<Type>::Clear()
204{
205 if(tail==head)//如果是空链表则不用清空
206 return;
207 fence=head;
208 while(fence->m_nodeNext!=tail)//删除最后一个前的节点
209 {
210 Remove();
211 }
212 Remove();//把最后一个节点删除
213 InitList();
214}
215
216/**//*******************************************
217/
218/ 函数: 当前指针向后移动
219/
220********************************************/
221
222template <class Type>
223bool DBLList<Type>::Next()
224{
225 if(fence==tail)//如果移到尾指针则返回false
226 return false;
227 fence=fence->m_nodeNext;
228 leftcnt++;
229 rightcnt--;
230 return true;
231}
232
233/**//*******************************************
234/
235/ 函数: 当前指针向前移动
236/
237********************************************/
238
239template <class Type>
240bool DBLList<Type>::Prev()
241{
242 if(fence==head)//如果移到头指针则返回false
243 return false;
244 fence=fence->m_nodePrev;
245 leftcnt--;
246 rightcnt++;
247 return true;
248}
249
250/**//*******************************************
251/
252/ 函数: 改变当前指针的指向 pos为节点位置
253/ 说明: 移动fence指针
254/ 注意: pos为0时指向空表头
255/
256********************************************/
257
258template <class Type>
259bool DBLList<Type>::SetPos(const int& pos)//位置从零开始
260{
261 if(pos<0||pos>=leftcnt+rightcnt)//输入<0||大于链表长度 返回false
262 return false;
263 int i=leftcnt,j=1;
264 while(i!=pos)//移动直至i==pos
265 {
266 if(i>pos)
267 {
268 Prev();
269 i--;
270 }
271 else
272 {
273 Next();
274 i++;
275 }
276 }
277 return true;
278}
279
280/**//*******************************************
281/
282/ 函数: 判断是否链表是否为空
283/ 说明: 空 返回 true
284/ 非空 返回 false
285/ 注意: 空表头不作统计
286/
287********************************************/
288
289template <class Type>
290bool DBLList<Type>::IsEmpty() const
291{
292 if(head->m_nodeNext==NULL)
293 return true;
294 return false;
295}
296
297/**//*******************************************
298/
299/ 函数: 重载操作符 =
300/ 说明: 用于链表之间的赋值,返回指向类本身的this指针
301/ 注意: 左操作数将会被覆盖,返回的链表fence指针指向空表头
302/
303********************************************/
304
305template <class Type>
306DBLList<Type>& DBLList<Type>::operator=(DBLList& list)//重载= 此操作会重置链表
307{
308 Clear();
309 list.SetPos(0);//fence指向头指针
310 while(list.Next())
311 {
312 Append(list.GetValue());
313 }
314 list.SetPos(0);//fence指向头指针
315 return *this;
316}
1/**//*
2 * 湖南大学软件学院07级5班Debugger小组
3 *
4 * 文件名称:DBLList.h
5 * 功能摘要:数据库双向链表 声明文件
6 *
7 * 作者:卓卓
8 * 创建日期:2009年3月14日
9 * 修改日期:2009年3月25日(添加注释并修复letcnt++bug)
10 */
11#pragma once
12
13#include "DBLinkNode.h"
14#include "DBListADT.h"
15#include <iostream>
16using namespace std;
17
18template <class Type>
19class DBLList:public DBListADT<Type>
20{
21private:
22 DBLinkNode<Type> *head;//头结点
23 DBLinkNode<Type> *tail;//尾节点
24 DBLinkNode<Type> *fence;//当前节点
25 int rightcnt;//右端长度
26 int leftcnt;//左端长度
27 void InitList();//初始化链表
28 void RemoveAll();//清空链表
29public:
30 DBLList(void);
31 DBLList(DBLList& list);
32 ~DBLList(void);
33 bool Insert(const Type& element);//插入
34 void Append(const Type& element);//追加
35 bool Remove();//删除fence的下一节点
36 void SetValue(const Type& element);//设置当前值
37 Type GetValue() const;//返回当前元素的值
38 bool Find(Type& element);//查找元素的位置
39 void Clear();//清空链表
40 bool SetPos(const int& pos);//设置位置
41 bool Prev();//fence向前移动
42 bool Next();//fence向后移动
43 bool IsEmpty() const;//链表是否为空 true为空
44 DBLList& operator=(DBLList& list);
45};
46
47template <class Type>
48DBLList<Type>::DBLList()
49{
50 InitList();//初始化
51}
52
53template <class Type>
54DBLList<Type>::DBLList(DBLList& list)
55{
56 InitList();
57 list.SetPos(0);//fence指向头指针
58 while(list.Next())
59 {
60 Append(list.GetValue());
61 }
62 list.SetPos(0);//fence指向头指针
63}
64
65template <class Type>
66DBLList<Type>::~DBLList()
67{
68 Clear();//清空
69}
70
71/**//*******************************************
72/
73/ 函数: 初始化链表
74/ 说明: 空节点作为表头
75/
76********************************************/
77
78template <class Type>
79void DBLList<Type>::InitList()
80{
81 fence=head=tail=new DBLinkNode<Type>;
82 rightcnt=1;
83 leftcnt=0;
84}
85
86/**//*******************************************
87/
88/ 函数: 插入节点
89/ 说明: 插入到fence指向下一个位置
90/
91********************************************/
92
93template <class Type>
94bool DBLList<Type>::Insert(const Type& element)
95{
96 fence=fence->m_nodeNext=new DBLinkNode<Type>(element,fence,fence->m_nodeNext);
97 if(fence->m_nodeNext!=NULL)
98 {
99 fence->m_nodeNext->m_nodePrev=fence;//若不是尾指针,fence指向的下一节点的前指针域指向fence
100 }
101 else
102 {
103 tail=fence;//如果是尾指针,则改变尾指针指向当前指针
104 }
105 leftcnt++;
106 return true;
107}
108
109/**//*******************************************
110/
111/ 函数: 在表尾追加一个节点
112/
113********************************************/
114
115template <class Type>
116void DBLList<Type>::Append(const Type& element)
117{
118 tail=tail->m_nodeNext=new DBLinkNode<Type>(element,tail,NULL);
119 //tail=fence;不要移动fence指针
120 leftcnt++;
121}
122
123/**//*******************************************
124/
125/ 函数: 设置当前节点的值
126/
127********************************************/
128
129template <class Type>
130void DBLList<Type>::SetValue(const Type& element)
131{
132 fence->m_nodeElement=element;
133}
134
135/**//*******************************************
136/
137/ 函数: 返回当前节点的值
138/
139********************************************/
140
141template <class Type>
142Type DBLList<Type>::GetValue() const
143{
144 return fence->m_nodeElement;
145}
146
147/**//*******************************************
148/
149/ 函数: 查找
150/ 说明: 未完善
151/
152********************************************/
153
154template <class Type>
155bool DBLList<Type>::Find(Type& element)
156{
157 return true;
158}
159/**//*******************************************
160/
161/ 函数: 删除节点
162/ 说明: 删除fence指向的下一个节点
163/ 注意: 空表头不会被删除
164/
165********************************************/
166template <class Type>
167bool DBLList<Type>::Remove()//删除fence下一个节点
168{
169 if(fence->m_nodeNext==NULL)
170 return false;
171 DBLinkNode<Type>* tmp=fence->m_nodeNext;//tmp指向要删除的节点
172 fence->m_nodeNext=tmp->m_nodeNext;
173 if(tmp->m_nodeNext!=0)
174 tmp->m_nodeNext->m_nodePrev=fence;
175 else
176 tail=fence;
177 delete tmp;
178 rightcnt--;
179 return true;
180}
181
182template <class Type>
183void DBLList<Type>::RemoveAll()
184{
185 fence=head;
186 while(fence->m_nodeNext!=tail)//删除最后一个前的节点
187 {
188 Remove();
189 }
190 Remove();//把最后一个节点删除
191 InitList();
192}
193
194/**//*******************************************
195/
196/ 函数: 清空链表
197/ 说明: 移动fence指针
198/ 注意: 空链表返回
199/
200********************************************/
201
202template <class Type>
203void DBLList<Type>::Clear()
204{
205 if(tail==head)//如果是空链表则不用清空
206 return;
207 fence=head;
208 while(fence->m_nodeNext!=tail)//删除最后一个前的节点
209 {
210 Remove();
211 }
212 Remove();//把最后一个节点删除
213 InitList();
214}
215
216/**//*******************************************
217/
218/ 函数: 当前指针向后移动
219/
220********************************************/
221
222template <class Type>
223bool DBLList<Type>::Next()
224{
225 if(fence==tail)//如果移到尾指针则返回false
226 return false;
227 fence=fence->m_nodeNext;
228 leftcnt++;
229 rightcnt--;
230 return true;
231}
232
233/**//*******************************************
234/
235/ 函数: 当前指针向前移动
236/
237********************************************/
238
239template <class Type>
240bool DBLList<Type>::Prev()
241{
242 if(fence==head)//如果移到头指针则返回false
243 return false;
244 fence=fence->m_nodePrev;
245 leftcnt--;
246 rightcnt++;
247 return true;
248}
249
250/**//*******************************************
251/
252/ 函数: 改变当前指针的指向 pos为节点位置
253/ 说明: 移动fence指针
254/ 注意: pos为0时指向空表头
255/
256********************************************/
257
258template <class Type>
259bool DBLList<Type>::SetPos(const int& pos)//位置从零开始
260{
261 if(pos<0||pos>=leftcnt+rightcnt)//输入<0||大于链表长度 返回false
262 return false;
263 int i=leftcnt,j=1;
264 while(i!=pos)//移动直至i==pos
265 {
266 if(i>pos)
267 {
268 Prev();
269 i--;
270 }
271 else
272 {
273 Next();
274 i++;
275 }
276 }
277 return true;
278}
279
280/**//*******************************************
281/
282/ 函数: 判断是否链表是否为空
283/ 说明: 空 返回 true
284/ 非空 返回 false
285/ 注意: 空表头不作统计
286/
287********************************************/
288
289template <class Type>
290bool DBLList<Type>::IsEmpty() const
291{
292 if(head->m_nodeNext==NULL)
293 return true;
294 return false;
295}
296
297/**//*******************************************
298/
299/ 函数: 重载操作符 =
300/ 说明: 用于链表之间的赋值,返回指向类本身的this指针
301/ 注意: 左操作数将会被覆盖,返回的链表fence指针指向空表头
302/
303********************************************/
304
305template <class Type>
306DBLList<Type>& DBLList<Type>::operator=(DBLList& list)//重载= 此操作会重置链表
307{
308 Clear();
309 list.SetPos(0);//fence指向头指针
310 while(list.Next())
311 {
312 Append(list.GetValue());
313 }
314 list.SetPos(0);//fence指向头指针
315 return *this;
316}
DBLinkNode.h(节点类,包括可利用空间表)
Code
1/**//*
2 * 湖南大学软件学院07级5班Debugger小组
3 *
4 * 文件名称:DBLinkNode.h
5 * 功能摘要:数据库双向链表节点 声明文件
6 *
7 * 作者:卓卓
8 * 创建日期:2009年3月14日
9 * 修改日期:2009年3月16日 (增加可利用空间表)
10 * 2009年3月25日
11 */
12#pragma once
13
14template <class Type>
15class DBLinkNode
16{
17private:
18 static DBLinkNode<Type>* freelist;
19public:
20 Type m_nodeElement;//数据
21 DBLinkNode* m_nodeNext;//后指针
22 DBLinkNode* m_nodePrev;//前指针
23 DBLinkNode(const Type& element,DBLinkNode* prev,DBLinkNode* next);
24 DBLinkNode(DBLinkNode* prev=0,DBLinkNode* next=0);
25 void* operator new (size_t);
26 void operator delete(void* ptr);
27};
28
29
30
31template <class Type>
32DBLinkNode<Type>::DBLinkNode(const Type& element,DBLinkNode* prev,DBLinkNode* next)
33{
34 m_nodeElement=element;
35 m_nodeNext=next;
36 m_nodePrev=prev;
37}
38
39template <class Type>
40DBLinkNode<Type>::DBLinkNode(DBLinkNode* prev=0,DBLinkNode* next=0)
41{
42 m_nodePrev=prev;
43 m_nodeNext=next;
44}
45
46template <class Type>
47DBLinkNode<Type>* DBLinkNode<Type>::freelist=0;
48
49template <class Type>
50void* DBLinkNode<Type>::operator new(size_t)//重载new
51{
52 if(freelist==0) return ::new DBLinkNode;
53 DBLinkNode<Type>* tmp=freelist;
54 freelist=freelist->m_nodeNext;
55 freelist->m_nodePrev=0;
56 return tmp;
57}
58
59template <class Type>
60void DBLinkNode<Type>::operator delete(void* ptr)//重载delete
61{
62 ((DBLinkNode<Type>*)ptr)->m_nodeNext=freelist;
63 ((DBLinkNode<Type>*)ptr)->m_nodePrev=0;
64 freelist=(DBLinkNode<Type>*)ptr;
65}
66
67
1/**//*
2 * 湖南大学软件学院07级5班Debugger小组
3 *
4 * 文件名称:DBLinkNode.h
5 * 功能摘要:数据库双向链表节点 声明文件
6 *
7 * 作者:卓卓
8 * 创建日期:2009年3月14日
9 * 修改日期:2009年3月16日 (增加可利用空间表)
10 * 2009年3月25日
11 */
12#pragma once
13
14template <class Type>
15class DBLinkNode
16{
17private:
18 static DBLinkNode<Type>* freelist;
19public:
20 Type m_nodeElement;//数据
21 DBLinkNode* m_nodeNext;//后指针
22 DBLinkNode* m_nodePrev;//前指针
23 DBLinkNode(const Type& element,DBLinkNode* prev,DBLinkNode* next);
24 DBLinkNode(DBLinkNode* prev=0,DBLinkNode* next=0);
25 void* operator new (size_t);
26 void operator delete(void* ptr);
27};
28
29
30
31template <class Type>
32DBLinkNode<Type>::DBLinkNode(const Type& element,DBLinkNode* prev,DBLinkNode* next)
33{
34 m_nodeElement=element;
35 m_nodeNext=next;
36 m_nodePrev=prev;
37}
38
39template <class Type>
40DBLinkNode<Type>::DBLinkNode(DBLinkNode* prev=0,DBLinkNode* next=0)
41{
42 m_nodePrev=prev;
43 m_nodeNext=next;
44}
45
46template <class Type>
47DBLinkNode<Type>* DBLinkNode<Type>::freelist=0;
48
49template <class Type>
50void* DBLinkNode<Type>::operator new(size_t)//重载new
51{
52 if(freelist==0) return ::new DBLinkNode;
53 DBLinkNode<Type>* tmp=freelist;
54 freelist=freelist->m_nodeNext;
55 freelist->m_nodePrev=0;
56 return tmp;
57}
58
59template <class Type>
60void DBLinkNode<Type>::operator delete(void* ptr)//重载delete
61{
62 ((DBLinkNode<Type>*)ptr)->m_nodeNext=freelist;
63 ((DBLinkNode<Type>*)ptr)->m_nodePrev=0;
64 freelist=(DBLinkNode<Type>*)ptr;
65}
66
67
DBListADT.h(线性表ADT)
Code
1/**//*
2 * 湖南大学软件学院07级5班Debugger小组
3 *
4 * 文件名称:DBListADT.h
5 * 功能摘要:数据库线性表ADT 声明文件
6 *
7 * 作者:卓卓
8 * 创建日期 :2009年3月14日
9 */
10#pragma once
11
12template <class Type>
13class DBListADT
14{
15public:
16 virtual bool Insert(const Type&)=0;
17 virtual void Append(const Type&)=0;
18 virtual bool Remove()=0;
19 virtual void SetValue(const Type&)=0;
20 virtual bool Find(Type&)=0;
21 virtual void Clear()=0;
22 virtual bool SetPos(const int&)=0;
23 virtual bool Prev()=0;
24 virtual bool Next()=0;
25 virtual Type GetValue() const=0;
26};
27
1/**//*
2 * 湖南大学软件学院07级5班Debugger小组
3 *
4 * 文件名称:DBListADT.h
5 * 功能摘要:数据库线性表ADT 声明文件
6 *
7 * 作者:卓卓
8 * 创建日期 :2009年3月14日
9 */
10#pragma once
11
12template <class Type>
13class DBListADT
14{
15public:
16 virtual bool Insert(const Type&)=0;
17 virtual void Append(const Type&)=0;
18 virtual bool Remove()=0;
19 virtual void SetValue(const Type&)=0;
20 virtual bool Find(Type&)=0;
21 virtual void Clear()=0;
22 virtual bool SetPos(const int&)=0;
23 virtual bool Prev()=0;
24 virtual bool Next()=0;
25 virtual Type GetValue() const=0;
26};
27