⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ep8_9.h

📁 这里有大量的c语言习题呢!真的是题海哦
💻 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&&current!=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 + -