双向链表C++实现
阅读: 482 评论: 3 作者: mini数据库 发表于 2009-03-27 18:03 原文链接
TableHead类决定使用双向链表,可快速找到其前驱。
实现代码如下
DBLList.h(双向链表类)
1

/**//* 2
* 湖南大学软件学院07级5班Debugger小组 3
*4
* 文件名称:DBLList.h5
* 功能摘要:数据库双向链表 声明文件6
*7
* 作者:卓卓8
* 创建日期:2009年3月14日 9
* 修改日期:2009年3月25日(添加注释并修复letcnt++bug)10
*/11
#pragma once12

13
#include "DBLinkNode.h"14
#include "DBListADT.h"15
#include <iostream>16
using namespace std;17

18
template <class Type>19
class DBLList:public DBListADT<Type>20


{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

47
template <class Type>48
DBLList<Type>::DBLList()49


{50
InitList();//初始化51
}52

53
template <class Type>54
DBLList<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

65
template <class Type>66
DBLList<Type>::~DBLList()67


{68
Clear();//清空69
}70

71

/**//*******************************************72
/73
/ 函数: 初始化链表74
/ 说明: 空节点作为表头75
/76
********************************************/77

78
template <class Type>79
void 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

93
template <class Type>94
bool 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指向的下一节点的前指针域指向fence100
}101
else102

{103
tail=fence;//如果是尾指针,则改变尾指针指向当前指针104
}105
leftcnt++;106
return true;107
}108

109

/**//*******************************************110
/111
/ 函数: 在表尾追加一个节点112
/113
********************************************/114

115
template <class Type>116
void 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

129
template <class Type>130
void DBLList<Type>::SetValue(const Type& element)131


{132
fence->m_nodeElement=element;133
}134

135

/**//*******************************************136
/137
/ 函数: 返回当前节点的值138
/139
********************************************/140

141
template <class Type>142
Type DBLList<Type>::GetValue() const143


{144
return fence->m_nodeElement;145
}146

147

/**//*******************************************148
/149
/ 函数: 查找150
/ 说明: 未完善151
/152
********************************************/153

154
template <class Type>155
bool DBLList<Type>::Find(Type& element)156


{157
return true;158
}159

/**//*******************************************160
/161
/ 函数: 删除节点162
/ 说明: 删除fence指向的下一个节点163
/ 注意: 空表头不会被删除164
/165
********************************************/166
template <class Type>167
bool 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
else176
tail=fence;177
delete tmp;178
rightcnt--;179
return true;180
}181

182
template <class Type>183
void 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

202
template <class Type>203
void 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

222
template <class Type>223
bool DBLList<Type>::Next()224


{225
if(fence==tail)//如果移到尾指针则返回false226
return false;227
fence=fence->m_nodeNext;228
leftcnt++;229
rightcnt--;230
return true;231
}232

233

/**//*******************************************234
/235
/ 函数: 当前指针向前移动236
/237
********************************************/238

239
template <class Type>240
bool DBLList<Type>::Prev()241


{242
if(fence==head)//如果移到头指针则返回false243
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

258
template <class Type>259
bool DBLList<Type>::SetPos(const int& pos)//位置从零开始260


{261
if(pos<0||pos>=leftcnt+rightcnt)//输入<0||大于链表长度 返回false262
return false;263
int i=leftcnt,j=1;264
while(i!=pos)//移动直至i==pos265

{266
if(i>pos)267

{268
Prev();269
i--;270
}271
else272

{273
Next();274
i++;275
}276
}277
return true;278
}279

280

/**//*******************************************281
/282
/ 函数: 判断是否链表是否为空283
/ 说明: 空 返回 true284
/ 非空 返回 false285
/ 注意: 空表头不作统计286
/287
********************************************/288

289
template <class Type>290
bool DBLList<Type>::IsEmpty() const291


{292
if(head->m_nodeNext==NULL)293
return true;294
return false;295
}296
297

/**//*******************************************298
/299
/ 函数: 重载操作符 =300
/ 说明: 用于链表之间的赋值,返回指向类本身的this指针301
/ 注意: 左操作数将会被覆盖,返回的链表fence指针指向空表头302
/303
********************************************/304

305
template <class Type>306
DBLList<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(节点类,包括可利用空间表)
1

/**//* 2
* 湖南大学软件学院07级5班Debugger小组 3
*4
* 文件名称:DBLinkNode.h5
* 功能摘要:数据库双向链表节点 声明文件6
*7
* 作者:卓卓8
* 创建日期:2009年3月14日9
* 修改日期:2009年3月16日 (增加可利用空间表)10
* 2009年3月25日 11
*/12
#pragma once13

14
template <class Type>15
class DBLinkNode16


{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

29

30

31
template <class Type>32
DBLinkNode<Type>::DBLinkNode(const Type& element,DBLinkNode* prev,DBLinkNode* next)33


{34
m_nodeElement=element;35
m_nodeNext=next;36
m_nodePrev=prev;37
}38

39
template <class Type>40
DBLinkNode<Type>::DBLinkNode(DBLinkNode* prev=0,DBLinkNode* next=0)41


{42
m_nodePrev=prev;43
m_nodeNext=next;44
}45

46
template <class Type>47
DBLinkNode<Type>* DBLinkNode<Type>::freelist=0;48

49
template <class Type>50
void* DBLinkNode<Type>::operator new(size_t)//重载new51


{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

59
template <class Type>60
void DBLinkNode<Type>::operator delete(void* ptr)//重载delete61


{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)
1

/**//* 2
* 湖南大学软件学院07级5班Debugger小组 3
*4
* 文件名称:DBListADT.h5
* 功能摘要:数据库线性表ADT 声明文件6
*7
* 作者:卓卓8
* 创建日期 :2009年3月14日 9
*/10
#pragma once11

12
template <class Type>13
class DBListADT14


{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

新闻频道:09年16款最佳IT产品 Windows7获年度大奖
推荐链接:Windows 7专题发布
浙公网安备 33010602011771号