双向链表C++实现

  阅读: 482 评论: 3 作者: mini数据库 发表于 2009-03-27 18:03 原文链接

TableHead类决定使用双向链表,可快速找到其前驱。

实现代码如下

 

DBLList.h(双向链表类)

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

 11None.gif#pragma once
 12None.gif
 13None.gif#include "DBLinkNode.h"
 14None.gif#include "DBListADT.h"
 15None.gif#include <iostream>
 16None.gifusing namespace std;
 17None.gif
 18None.giftemplate <class Type>
 19None.gifclass DBLList:public DBListADT<Type>
 20ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 21InBlock.gifprivate:
 22InBlock.gif    DBLinkNode<Type> *head;//头结点
 23InBlock.gif    DBLinkNode<Type> *tail;//尾节点
 24InBlock.gif    DBLinkNode<Type> *fence;//当前节点
 25InBlock.gif    int rightcnt;//右端长度
 26InBlock.gif    int leftcnt;//左端长度
 27InBlock.gif    void InitList();//初始化链表
 28InBlock.gif    void RemoveAll();//清空链表
 29InBlock.gifpublic:
 30InBlock.gif    DBLList(void);
 31InBlock.gif    DBLList(DBLList& list);
 32InBlock.gif    ~DBLList(void);
 33InBlock.gif    bool Insert(const Type& element);//插入
 34InBlock.gif    void Append(const Type& element);//追加
 35InBlock.gif    bool Remove();//删除fence的下一节点
 36InBlock.gif    void SetValue(const Type& element);//设置当前值
 37InBlock.gif    Type GetValue() const;//返回当前元素的值
 38InBlock.gif    bool Find(Type& element);//查找元素的位置
 39InBlock.gif    void Clear();//清空链表
 40InBlock.gif    bool SetPos(const int& pos);//设置位置
 41InBlock.gif    bool Prev();//fence向前移动
 42InBlock.gif    bool Next();//fence向后移动
 43InBlock.gif    bool IsEmpty() const;//链表是否为空 true为空
 44InBlock.gif    DBLList& operator=(DBLList& list);    
 45ExpandedBlockEnd.gif}
;
 46None.gif
 47None.giftemplate <class Type>
 48None.gifDBLList<Type>::DBLList()
 49ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 50InBlock.gif    InitList();//初始化
 51ExpandedBlockEnd.gif}

 52None.gif
 53None.giftemplate <class Type>
 54None.gifDBLList<Type>::DBLList(DBLList& list)
 55ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 56InBlock.gif    InitList();
 57InBlock.gif    list.SetPos(0);//fence指向头指针
 58InBlock.gif    while(list.Next())
 59ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 60InBlock.gif        Append(list.GetValue());
 61ExpandedSubBlockEnd.gif    }

 62InBlock.gif    list.SetPos(0);//fence指向头指针
 63ExpandedBlockEnd.gif}

 64None.gif
 65None.giftemplate <class Type>
 66None.gifDBLList<Type>::~DBLList()
 67ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 68InBlock.gif    Clear();//清空
 69ExpandedBlockEnd.gif}

 70None.gif
 71ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
 72InBlock.gif/
 73InBlock.gif/    函数:  初始化链表
 74InBlock.gif/    说明:  空节点作为表头
 75InBlock.gif/
 76ExpandedBlockEnd.gif********************************************/

 77None.gif
 78None.giftemplate <class Type>
 79None.gifvoid DBLList<Type>::InitList()
 80ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 81InBlock.gif    fence=head=tail=new DBLinkNode<Type>;
 82InBlock.gif    rightcnt=1;
 83InBlock.gif    leftcnt=0;
 84ExpandedBlockEnd.gif}

 85None.gif
 86ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
 87InBlock.gif/
 88InBlock.gif/    函数:  插入节点
 89InBlock.gif/    说明:  插入到fence指向下一个位置
 90InBlock.gif/
 91ExpandedBlockEnd.gif********************************************/

 92None.gif
 93None.giftemplate <class Type>
 94None.gifbool DBLList<Type>::Insert(const Type& element)
 95ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 96InBlock.gif    fence=fence->m_nodeNext=new DBLinkNode<Type>(element,fence,fence->m_nodeNext);
 97InBlock.gif    if(fence->m_nodeNext!=NULL)
 98ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 99InBlock.gif        fence->m_nodeNext->m_nodePrev=fence;//若不是尾指针,fence指向的下一节点的前指针域指向fence
100ExpandedSubBlockEnd.gif    }

101InBlock.gif    else
102ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
103InBlock.gif        tail=fence;//如果是尾指针,则改变尾指针指向当前指针
104ExpandedSubBlockEnd.gif    }

105InBlock.gif    leftcnt++;
106InBlock.gif    return true;
107ExpandedBlockEnd.gif}

108None.gif
109ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
110InBlock.gif/
111InBlock.gif/    函数:  在表尾追加一个节点
112InBlock.gif/
113ExpandedBlockEnd.gif********************************************/

114None.gif
115None.giftemplate <class Type>
116None.gifvoid DBLList<Type>::Append(const Type& element)
117ExpandedBlockStart.gifContractedBlock.gifdot.gif{
118InBlock.gif    tail=tail->m_nodeNext=new DBLinkNode<Type>(element,tail,NULL);
119InBlock.gif    //tail=fence;不要移动fence指针
120InBlock.gif    leftcnt++;
121ExpandedBlockEnd.gif}

122None.gif
123ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
124InBlock.gif/
125InBlock.gif/    函数:  设置当前节点的值
126InBlock.gif/
127ExpandedBlockEnd.gif********************************************/

128None.gif
129None.giftemplate <class Type>
130None.gifvoid DBLList<Type>::SetValue(const Type& element)
131ExpandedBlockStart.gifContractedBlock.gifdot.gif{
132InBlock.gif    fence->m_nodeElement=element;
133ExpandedBlockEnd.gif}

134None.gif
135ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
136InBlock.gif/
137InBlock.gif/    函数:  返回当前节点的值
138InBlock.gif/
139ExpandedBlockEnd.gif********************************************/

140None.gif
141None.giftemplate <class Type>
142None.gifType DBLList<Type>::GetValue() const
143ExpandedBlockStart.gifContractedBlock.gifdot.gif{
144InBlock.gif    return fence->m_nodeElement;
145ExpandedBlockEnd.gif}

146None.gif
147ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
148InBlock.gif/
149InBlock.gif/    函数:  查找
150InBlock.gif/    说明:  未完善
151InBlock.gif/
152ExpandedBlockEnd.gif********************************************/

153None.gif
154None.giftemplate <class Type>
155None.gifbool DBLList<Type>::Find(Type& element)
156ExpandedBlockStart.gifContractedBlock.gifdot.gif{
157InBlock.gif    return true;
158ExpandedBlockEnd.gif}

159ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
160InBlock.gif/
161InBlock.gif/    函数:  删除节点
162InBlock.gif/    说明:  删除fence指向的下一个节点
163InBlock.gif/    注意:    空表头不会被删除
164InBlock.gif/
165ExpandedBlockEnd.gif********************************************/

166None.giftemplate <class Type>
167None.gifbool DBLList<Type>::Remove()//删除fence下一个节点
168ExpandedBlockStart.gifContractedBlock.gifdot.gif{
169InBlock.gif    if(fence->m_nodeNext==NULL)
170InBlock.gif        return false;
171InBlock.gif    DBLinkNode<Type>* tmp=fence->m_nodeNext;//tmp指向要删除的节点
172InBlock.gif    fence->m_nodeNext=tmp->m_nodeNext;
173InBlock.gif    if(tmp->m_nodeNext!=0)
174InBlock.gif        tmp->m_nodeNext->m_nodePrev=fence;
175InBlock.gif    else
176InBlock.gif        tail=fence;
177InBlock.gif    delete tmp;
178InBlock.gif    rightcnt--;
179InBlock.gif    return true;
180ExpandedBlockEnd.gif}

181None.gif
182None.giftemplate <class Type>
183None.gifvoid DBLList<Type>::RemoveAll()
184ExpandedBlockStart.gifContractedBlock.gifdot.gif{
185InBlock.gif    fence=head;
186InBlock.gif    while(fence->m_nodeNext!=tail)//删除最后一个前的节点
187ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
188InBlock.gif        Remove();        
189ExpandedSubBlockEnd.gif    }

190InBlock.gif    Remove();//把最后一个节点删除
191InBlock.gif    InitList();
192ExpandedBlockEnd.gif}

193None.gif
194ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
195InBlock.gif/
196InBlock.gif/    函数:  清空链表
197InBlock.gif/    说明:  移动fence指针
198InBlock.gif/    注意:    空链表返回
199InBlock.gif/
200ExpandedBlockEnd.gif********************************************/

201None.gif
202None.giftemplate <class Type>
203None.gifvoid DBLList<Type>::Clear()
204ExpandedBlockStart.gifContractedBlock.gifdot.gif{
205InBlock.gif    if(tail==head)//如果是空链表则不用清空
206InBlock.gif        return;
207InBlock.gif    fence=head;
208InBlock.gif    while(fence->m_nodeNext!=tail)//删除最后一个前的节点
209ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
210InBlock.gif        Remove();        
211ExpandedSubBlockEnd.gif    }

212InBlock.gif    Remove();//把最后一个节点删除
213InBlock.gif    InitList();
214ExpandedBlockEnd.gif}

215None.gif
216ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
217InBlock.gif/
218InBlock.gif/    函数:  当前指针向后移动
219InBlock.gif/
220ExpandedBlockEnd.gif********************************************/

221None.gif
222None.giftemplate <class Type>
223None.gifbool DBLList<Type>::Next()
224ExpandedBlockStart.gifContractedBlock.gifdot.gif{
225InBlock.gif    if(fence==tail)//如果移到尾指针则返回false
226InBlock.gif        return false;
227InBlock.gif    fence=fence->m_nodeNext;
228InBlock.gif    leftcnt++;
229InBlock.gif    rightcnt--;
230InBlock.gif    return true;
231ExpandedBlockEnd.gif}

232None.gif
233ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
234InBlock.gif/
235InBlock.gif/    函数:  当前指针向前移动
236InBlock.gif/
237ExpandedBlockEnd.gif********************************************/

238None.gif
239None.giftemplate <class Type>
240None.gifbool DBLList<Type>::Prev()
241ExpandedBlockStart.gifContractedBlock.gifdot.gif{
242InBlock.gif    if(fence==head)//如果移到头指针则返回false
243InBlock.gif        return false;
244InBlock.gif    fence=fence->m_nodePrev;
245InBlock.gif    leftcnt--;
246InBlock.gif    rightcnt++;
247InBlock.gif    return true;
248ExpandedBlockEnd.gif}

249None.gif
250ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
251InBlock.gif/
252InBlock.gif/    函数:  改变当前指针的指向 pos为节点位置
253InBlock.gif/    说明:  移动fence指针
254InBlock.gif/    注意:    pos为0时指向空表头
255InBlock.gif/
256ExpandedBlockEnd.gif********************************************/

257None.gif
258None.giftemplate <class Type>
259None.gifbool DBLList<Type>::SetPos(const int& pos)//位置从零开始
260ExpandedBlockStart.gifContractedBlock.gifdot.gif{
261InBlock.gif    if(pos<0||pos>=leftcnt+rightcnt)//输入<0||大于链表长度 返回false
262InBlock.gif        return false;
263InBlock.gif    int i=leftcnt,j=1;
264InBlock.gif    while(i!=pos)//移动直至i==pos
265ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
266InBlock.gif        if(i>pos)
267ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
268InBlock.gif            Prev();
269InBlock.gif            i--;
270ExpandedSubBlockEnd.gif        }

271InBlock.gif        else
272ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
273InBlock.gif            Next();
274InBlock.gif            i++;
275ExpandedSubBlockEnd.gif        }

276ExpandedSubBlockEnd.gif    }

277InBlock.gif    return true;
278ExpandedBlockEnd.gif}

279None.gif
280ExpandedBlockStart.gifContractedBlock.gif/**//*******************************************
281InBlock.gif/
282InBlock.gif/    函数:  判断是否链表是否为空
283InBlock.gif/    说明:  空   返回 true
284InBlock.gif/           非空 返回 false
285InBlock.gif/    注意:    空表头不作统计
286InBlock.gif/
287ExpandedBlockEnd.gif********************************************/

288None.gif
289None.giftemplate <class Type>
290None.gifbool DBLList<Type>::IsEmpty() const
291ExpandedBlockStart.gifContractedBlock.gifdot.gif{
292InBlock.gif    if(head->m_nodeNext==NULL)
293InBlock.gif        return true;
294InBlock.gif    return false;
295ExpandedBlockEnd.gif}

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

304None.gif
305None.giftemplate <class Type>
306None.gifDBLList<Type>& DBLList<Type>::operator=(DBLList& list)//重载= 此操作会重置链表
307ExpandedBlockStart.gifContractedBlock.gifdot.gif{
308InBlock.gif    Clear();
309InBlock.gif    list.SetPos(0);//fence指向头指针
310InBlock.gif    while(list.Next())
311ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
312InBlock.gif        Append(list.GetValue());
313ExpandedSubBlockEnd.gif    }

314InBlock.gif    list.SetPos(0);//fence指向头指针
315InBlock.gif    return *this;
316ExpandedBlockEnd.gif}


DBLinkNode.h(节点类,包括可利用空间表)

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

12None.gif#pragma once
13None.gif
14None.giftemplate <class Type>
15None.gifclass DBLinkNode
16ExpandedBlockStart.gifContractedBlock.gifdot.gif{
17InBlock.gifprivate:
18InBlock.gif    static DBLinkNode<Type>* freelist;
19InBlock.gifpublic:
20InBlock.gif    Type m_nodeElement;//数据
21InBlock.gif    DBLinkNode* m_nodeNext;//后指针
22InBlock.gif    DBLinkNode* m_nodePrev;//前指针
23InBlock.gif    DBLinkNode(const Type& element,DBLinkNode* prev,DBLinkNode* next);
24InBlock.gif    DBLinkNode(DBLinkNode* prev=0,DBLinkNode* next=0);
25InBlock.gif    void* operator new (size_t);
26InBlock.gif    void operator delete(void* ptr);
27ExpandedBlockEnd.gif}
;
28None.gif
29None.gif
30None.gif
31None.giftemplate <class Type>
32None.gifDBLinkNode<Type>::DBLinkNode(const Type& element,DBLinkNode* prev,DBLinkNode* next)
33ExpandedBlockStart.gifContractedBlock.gifdot.gif{
34InBlock.gif    m_nodeElement=element;
35InBlock.gif    m_nodeNext=next;
36InBlock.gif    m_nodePrev=prev;
37ExpandedBlockEnd.gif}

38None.gif
39None.giftemplate <class Type>
40None.gifDBLinkNode<Type>::DBLinkNode(DBLinkNode* prev=0,DBLinkNode* next=0)
41ExpandedBlockStart.gifContractedBlock.gifdot.gif{
42InBlock.gif    m_nodePrev=prev;
43InBlock.gif    m_nodeNext=next;
44ExpandedBlockEnd.gif}

45None.gif
46None.giftemplate <class Type>
47None.gifDBLinkNode<Type>* DBLinkNode<Type>::freelist=0;
48None.gif
49None.giftemplate <class Type>
50None.gifvoid* DBLinkNode<Type>::operator new(size_t)//重载new
51ExpandedBlockStart.gifContractedBlock.gifdot.gif{
52InBlock.gif    if(freelist==0)    return ::new DBLinkNode;
53InBlock.gif    DBLinkNode<Type>* tmp=freelist;
54InBlock.gif    freelist=freelist->m_nodeNext;
55InBlock.gif    freelist->m_nodePrev=0;
56InBlock.gif    return tmp;
57ExpandedBlockEnd.gif}

58None.gif
59None.giftemplate <class Type>
60None.gifvoid DBLinkNode<Type>::operator delete(void* ptr)//重载delete
61ExpandedBlockStart.gifContractedBlock.gifdot.gif{
62InBlock.gif    ((DBLinkNode<Type>*)ptr)->m_nodeNext=freelist;
63InBlock.gif    ((DBLinkNode<Type>*)ptr)->m_nodePrev=0;
64InBlock.gif    freelist=(DBLinkNode<Type>*)ptr;
65ExpandedBlockEnd.gif}

66None.gif
67None.gif


DBListADT.h(线性表ADT)

ContractedBlock.gif ExpandedBlockStart.gif Code
 1ExpandedBlockStart.gifContractedBlock.gif/**//* 
 2InBlock.gif * 湖南大学软件学院07级5班Debugger小组 
 3InBlock.gif *
 4InBlock.gif * 文件名称:DBListADT.h
 5InBlock.gif * 功能摘要:数据库线性表ADT 声明文件
 6InBlock.gif *
 7InBlock.gif * 作者:卓卓
 8InBlock.gif * 创建日期 :2009年3月14日 
 9ExpandedBlockEnd.gif */

10None.gif#pragma once
11None.gif
12None.giftemplate <class Type>
13None.gifclass DBListADT
14ExpandedBlockStart.gifContractedBlock.gifdot.gif{
15InBlock.gifpublic:
16InBlock.gif    virtual bool Insert(const Type&)=0;
17InBlock.gif    virtual void Append(const Type&)=0;
18InBlock.gif    virtual bool Remove()=0;
19InBlock.gif    virtual void SetValue(const Type&)=0;
20InBlock.gif    virtual bool Find(Type&)=0;
21InBlock.gif    virtual void Clear()=0;
22InBlock.gif    virtual bool SetPos(const int&)=0;
23InBlock.gif    virtual bool Prev()=0;
24InBlock.gif    virtual bool Next()=0;
25InBlock.gif    virtual Type GetValue() const=0;
26ExpandedBlockEnd.gif}
;
27None.gif


  发表评论


新闻频道:09年16款最佳IT产品 Windows7获年度大奖

推荐链接:Windows 7专题发布

网站导航:博客园首页  个人主页  新闻  社区  博问  闪存  知识库

转载于:https://www.cnblogs.com/dzodzo/archive/2009/03/27/1623336.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值