头文件--定义基类、双向链表类、结点类
#include "iostream.h"
#include "string.h"
class Object //定义抽象类
{
public:
Object(){}
virtual int IsEqual(Object&)=0;//实现2个结点数据的比较
virtual void Show()=0;//输出一个结点的数据
virtual ~Object(){}
};
class Node //结点类
{
public:
Node(){
Info=0;Prev=0;Next=0;
}
Node(Node &node) //拷贝构造函数
{
Info=node.Info;
Prev=node.Prev;
Next=node.Next;
}
void FillInfo(Object *obj){//使Info指向数据域
Info=obj;
}
friend class List; //友元类list
private:
Object *Info;//指向描述结点的数据域
Node *Prev,*Next;//构成链表的前后指针
};
class List //实现双向链表操作
{
public:
List(){Head=Tail=0;
}
~List(){DeleteList();
}
void AddNode(Node*); //链表尾加一结点
Node *DeleteNode(Node*);//删除指定结点
Node *LookUp(Object&);//查找一指定结点
void ShowList();//输出链表
void DeleteList();//删除链表
private:
Node *Head,*Tail;
};
void List::AddNode(Node *node)
{
if (Head==0) {
Head=Tail=node;
node->Next=node->Prev=0;
}
else{//加入链表尾
Tail->Next=node;//使链表尾结点的后指针指向插入的结点
node->Prev=Tail;//使插入结点的前指针指向原链表尾结点
Tail=node;//使Tail指向新的链表尾结点
node->Next=0;
}
}
Node *List::DeleteNode(Node *node)
{
if (node==Head)//要删除的结点为首结点
if(node==Tail)//表示链表上只有一个结点的情况
Head=Tail=0;
else{
Head=node->Next;
Head->Prev=0;
}
else{
node->Prev->Next=node->Next;//从后向链指针上取下该结点
if (node!=Tail) node->Next->Prev=node->Prev;
else{
Tail=node->Prev;Tail->Next=0;//要删除的结点为尾结点
}
}
node->Prev=node->Next=0;//将已删除结点的前后指针置空
return (node);
}
Node *List::LookUp(Object &obj)
{
Node *pn=Head;
while (pn) {
if (pn->Info->IsEqual(obj))return pn;//找到结点
pn=pn->Next;
}
return 0;//没有找到结点
}
void List::ShowList()
{
Node *p=Head;
while (p) {
p->Info->Show();
p=p->Next;
}
}
void List::DeleteList()
{
Node *p,*q;
p=Head;
while (p) {
delete p->Info;//释放结点数据
q=p;
p=p->Next;
delete q;//释放Node占的空间
}
}
类实现及主函数
class IntObj:public Object //派生描述结点数据的类
{
public:
IntObj(int x=0){data=x;}
void SetData(int x){
data=x;
}
int IsEqual(Object&);
void Show(){
cout<<"Data="<<data<<'\t';
}
private:
int data;
};
int IntObj::IsEqual(Object &obj)//重新定义比较2个结点是否相等的虚函数
{
IntObj &temp=(IntObj &)obj;
return (data==temp.data);
}
int main(void)
{
IntObj *p;
Node *pn,*pt,node;
List list;
for(int i=1;i<10;i++){//建立双向链表
p=new IntObj(i+50);//建立IntObj对象
pn=new Node;
pn->FillInfo(p);
list.AddNode(pn);
}
list.ShowList();
cout<<"\n";
IntObj da;
da.SetData(52);
pn=list.LookUp(da);
if (pn) {
pt=list.DeleteNode(pn);
}
list.ShowList();
cout<<"\n";
if (pn) {
list.AddNode(pt);
}
list.ShowList();
cout<<"\n";
return 0;
}