`
sjk2013
  • 浏览: 2176393 次
文章分类
社区版块
存档分类
最新评论

[C++]双向链表操作

 
阅读更多
头文件--定义基类、双向链表类、结点类
#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; 
} 


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics