- #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;
- }