📄 ep8_9.h
字号:
#include<iostream>
using namespace std;
//首先看结点组织,采用结点类加数据类
class Object{//数据类为抽象类
public:
Object(){}
virtual bool operator>(Object &)=0;//纯虚函数,参数必须为引用或指针
virtual bool operator!=(Object &)=0;//纯虚函数,参数必须为引用或指针
virtual void Print()=0;//纯虚函数
virtual ~Object(){} //析构函数可为虚函数,构造函数不行
};
class DblNode{
Object* info; //数据域用指针指向数据类对象
DblNode *llink,*rlink; //前驱(左链)、后继(右链)指针
public:
DblNode(); //生成头结点的构造函数
~DblNode();
void Linkinfo(Object* obj);
friend class DblList;
//以DblList为友元类,DblList可直接访问DblNode的私有函数,与结构一样方便,但更安全
};
DblNode::DblNode(){info=NULL;llink=rlink=NULL;}
DblNode::~DblNode(){
cout<<"删除结点类"<<'\t';
delete info; //释放数据域
}
void DblNode::Linkinfo(Object * obj){info=obj;}
//再定义双链表类,选择常用操作
class DblList{
DblNode *head,*current;
public:
DblList();//构造函数,生成头结点(空链表)
~DblList();//析构函数
void MakeEmpty();//清空链表,只余表头结点
void InsertFront(DblNode* p); //可用来向前生成链表,在表头插入一个结点
void InsertRear(DblNode* p); //可用来向后生成链表,在表尾添加一个结点
void InsertOrder(DblNode* p); //按升序生成链表
DblNode* CreatNode();//创建一个结点(孤立结点)
DblNode* DeleteNode(DblNode* p); //删除指定结点
void PrintList();//打印链表的数据域
int Length();//计算链表长度
DblNode *Find(Object & obj);//搜索数据域与定值相同的结点,返回该结点的地址
//其它操作
};
DblList::DblList(){//建立表头结点
head=new DblNode();
head->rlink=head->llink=head;
current=NULL;
}
DblList::~DblList(){
MakeEmpty();//清空链表
cout<<"删除头结点:";
delete head;
}
void DblList::MakeEmpty(){
DblNode *tempP;
while(head->rlink!=head){
tempP=head->rlink;
head->rlink=tempP->rlink;//把头结点后的第一个节点从链中脱离
tempP->rlink->llink=head;//处理左指针
delete tempP; //删除(释放)脱离下来的结点
}
current=NULL; //current指针恢复
}
void DblList::InsertFront(DblNode *p){
p->llink=head;//注意次序
p->rlink=head->rlink;
head->rlink->llink=p;
head->rlink=p;//最后做
}
void DblList::InsertRear(DblNode *p){
p->rlink=head;//注意次序
p->llink=head->llink;
head->llink->rlink=p;
head->llink=p;//最后做
}
void DblList::InsertOrder(DblNode* p){
if(head==head->llink) {
p->llink=head;//注意次序
p->rlink=head->rlink;
head->rlink->llink=p;
head->rlink=p;//最后做
}
else{
current=head->rlink;
while(current!=head){
if(*current->info>*p->info) break; //找第一个比插入结点大的结点
current=current->rlink;
}
p->rlink=current;//注意次序
p->llink=current->llink;
current->llink->rlink=p;
current->llink=p;//最后做
}
}
DblNode* DblList::CreatNode(){//建立新节点
current=new DblNode();
return current;
}
DblNode* DblList::DeleteNode(DblNode* p){
current=head->rlink;
while(current!=head&¤t!=p) current=current->rlink;
if(current==head) current=NULL;
else{//结点摘下
p->llink->rlink=p->rlink;
p->rlink->llink=p->llink;
p->rlink=p->llink=NULL;
}
return current;
}
DblNode* DblList::Find(Object & obj){//对抽象类只能用“引用”
current=head->rlink;
while(current!=head&&*current->info!=obj) current=current->rlink;
if(current==head) current=NULL;
return current;//搜索成功返回该结点地址,不成功返回NULL
}
void DblList::PrintList(){
current=head->rlink;
while(current!=head){
current->info->Print();
current=current->rlink;
}
cout<<endl;
}
DblList::Length(){
int count=0;
current=head->rlink;
while(current!=head){
count++;
current=current->rlink;
}
return count;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -