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