| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1922 人关注过本帖, 1 人收藏
标题:关于双向链表的类模板
只看楼主 加入收藏
lax521
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2005-8-17
收藏(1)
 问题点数:0 回复次数:4 
关于双向链表的类模板

要求如下

设计一个列表(链表)模板类List,具有以下功能:

(1)利用双向链表形成List类并可进行输入输出。

(2)对列表的运算符+,-,+=,-=进行重载。

(3)一般操作。

细节要求:

(1)构造:可利用链表对象和C 的一维数组构造链表对象以及拷贝构造对象;

(2)链表支持一般的数据类型

(3)运算:提供诸如添加、删除节点等操作

(4)输入输出:支持输入输出插入运算>><<

搜索更多相关主题的帖子: 链表 left align 模板 
2006-02-28 20:10
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
STL里有个list,参考参考吧

2006-02-28 22:02
lax521
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2005-8-17
收藏
得分:0 

这个基本上满足了要求
但是只是定义了模板并没有对运算符重载
等我改进一下

#include<iostream.h>
#include<stdlib.h>
//***“双向循环链表”类模板的定义***
/* 声明“双向循环链表”类模板 */
template <class Type> class DblList;
/* 定义“双向循环链表”结点类模板 */
template <class Type> class DblNode {
friend class DblList<Type>; //定义友元类
private:
Type data; //数据域
DblNode<Type> * lLink, * rLink; //指针域
public:
//构造函数:结点的数据域和指针域赋值
DblNode (Type value, DblNode<Type> *
left, DblNode<Type> * right) :
data (value), lLink (left), rLink(right)
{ }
DblNode( ):lLink(NULL),rLink(NULL)
{ }

DblNode<Type> * getLeftLink( )
{ return llink; } //取得左链指针值
DblNode<Type>*getRightLink ( )
{ return rlink; } //取得右链指针值
Type getData ( ) //取得数据域的值
{ return data; }
void setLeftLink (DblNode<Type>*Left)
{ llink = Left; } //修改左链指针值
void setRightLink ( DblNode<Type>*Right )
{ rlink = Right; } //修改左链指针值
void setData ( Type value )
{ data = value; } //修改数据域
}; /* 结点类模板定义完毕 */
/* 定义“双向循环链表”类模板 */
template <class Type> class DblList {
private:
//表头指针 当前指针
DblNode<Type> * first, * current;
public:
DblList ( ); //构造函数
~DblList ( ){ }; //析构函数
int Length ( ) const; //计算表长
int IsEmpty ( ) //判链表空否
{ return first->rLink == first; }
//查找结点
int Find ( const Type& target );
//当前指针置于表头结点。
//void Firster ( ) { current = first; }
int First ( ) ; //当前指针置于第一个结点
int Next ( ); //当前指针置于后继结点
int Prior ( ); //当前指针置于前驱结点
//插入一个包含有值value的新结点
void Insert ( const Type& value );
void Remove ( ); //删除当前结点
void display(bool) ; //显示输出链表
}; /* “双向循环链表”类模板定义完毕 */
//构造函数: 建立双向循环链表的表头结点
template <class Type>
DblList<Type> :: DblList ( )
{ //构造一个只有表头结点的空表
first = current =
new DblNode<Type> ;
if (first == NULL )
{ cerr << "存储分配错!\n"; exit(1); }
//规定空表的标志:表头结点的链指针指向自身
first->rLink = first->lLink = first;
}
//计算带表头结点的双向循环链表的长度
template <class Type>
int DblList<Type> :: Length ( ) const
{ //工作指针指向第一个结点
DblNode<Type> * p = first->rLink;
int count = 0; //计数
while ( p != first )
{ p = p->rLink; count++; }
return count; //返回结点数
}
//在双向循环链表中搜索含target的结点, 若
//找到, 则返回1, 同时current指针指向该结点,
//否则函数返回0。
template <class Type>
int DblList<Type> ::Find ( const Type& target )
{
DblNode<Type> * p=current;
current = first->rLink;
while ( current != first && current->data
!= target ) current = current->rLink;
if ( current != first ) return 1;
else {current=p;return 0;}
}
//在当前指针位置插入一个包含有值value的新结点
//当前指针current指向新结点
template <class Type>
void DblList<Type> ::Insert ( const Type & value )
{ //插入一个结点需要链结4个指针
if (IsEmpty ( )) //空表情形
current = first->rLink =
new DblNode<Type> (value,first,first);
else { //非空表情形
current =current->rLink =
new DblNode<Type>
( value, current, current->rLink );
}
//双向链接
current->rLink->lLink = current;
}
//删除当前结点,current指针后移
template <class Type>
void DblList<Type> :: Remove ( )
{
if (IsEmpty ( )) return; //空表
DblNode<Type> *temp = current; //被删结点
//当前指针进到下一结点
current = current->rLink;
//将被删结点从链中摘下
current->lLink = temp->lLink;
temp->lLink->rLink = current;
delete temp; //释放被删结点所占内存
if(Length()==0) //有可能删空
//规定空表的标志:表头结点的链指针指向自身
first->rLink = first->lLink = first;
//当前结点不能是表头结点
if (current==first) First();
}
//当前指针置于第一个结点
template <class Type>
int DblList<Type> :: First ( )
{
if ( !IsEmpty ( ) )
{ current = first->rLink; return 1; }
current = first; return 0;
}
//当前指针置于后继结点
template <class Type>
int DblList<Type> :: Next ( )
{ //如果当前指针指向的是最后结点
if ( current->rLink == first ) {
current = first ->rLink;
return 0;
}
current = current->rLink;
return 1;
}
//当前指针置于前驱结点
template <class Type>
int DblList<Type> :: Prior ( )
{ //如果当前指针指向的是第一个结点
if ( current->lLink == first ) {
current = first ->lLink;
return 0;
}
current = current->lLink;
return 1;
}
//显示输出链表:参数为逻辑值
//分别表示不同方向
template <class Type>
void DblList<Type> :: display (bool d)
{ if ( IsEmpty ( ) ) return;
DblNode<Type> *p;
if(d) p=first->rLink; //正向
else p=first->lLink; //反向
while(p!=first) {
cout<<p->data<<" ";
if(d) p=p->rLink;
else p=p->lLink;
}
cout<<'\n';
}

//主函数
void main()
{
DblList<char> D1; //定义链表
for(int i=65;i<75;i++)
D1.Insert(i); //插入结点
cout<<D1.Length()<<endl; //长度
if(D1.Find('E')) cout<<"Yes."<<'\n'; //查找
else cout<<"No."<<'\n';
D1.display(true); //双向显示
D1.display(false);
D1.Remove();
D1.display(true); //双向显示
D1.display(false);
}

2006-03-03 16:02
心流千雪
Rank: 1
等 级:等待验证会员
帖 子:16
专家分:7
注 册:2012-11-30
收藏
得分:0 
看不清楚也....汗
2012-11-30 10:23
心流千雪
Rank: 1
等 级:等待验证会员
帖 子:16
专家分:7
注 册:2012-11-30
收藏
得分:0 
这注释打的.....
2012-11-30 10:24
快速回复:关于双向链表的类模板
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037332 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved