您的位置:首页 > 其它

用链表实现优先级队列

2007-03-16 12:50 519 查看
//8.3.07
//pryQueue.h
//优先级队列链表实现
//
//定义优先级队列变量:pryQueue<datatype> variable或
// pryQueue<datatype> variable(datatype data,int priority,NULL)
//方法:int Empty(),if empty return 1,else return 0
// int Lenght(),return the length of le pryQueue
// datatype Peek(),return the data stored in the top node
// int Insert(datatype data,int pry); insert a node ,it`s data is data ,priority is pry
// datatype Delete(void);
// int ClearQueue(void);
//priority值越小优先级越高
template <class T>
struct pryNode
{
T data;
int pry;
pryNode<T> *next;
};

template <class T>
class pryQueue
{
private:
pryNode<T> *head,*rear;
int count;
pryNode<T> *GetNode(T &data,int &pry,pryNode<T> *next);
public:
pryQueue(void);
pryQueue(T &data,int pry,pryNode<T> *next=NULL);
~pryQueue(void);

int Length(void) const;
int Empty(void) const;
T Peek(void) const;

int Insert(T data,int pry);
T Delete(void);
int ClearQueue(void);
};

//-----------------------------------------------------
template <class T>
pryQueue<T>::pryQueue<T>(void)
{
head=new pryNode<T>;
// head->data=0;
head->pry=0;
rear=NULL;
head->next=rear;
count=0;
}
template <class T>
pryQueue<T>::pryQueue(T &data,int pry,pryNode<T> *next)
{
head=new pryNode<T>;
head->data=data;
head->pry=0;
rear=GetNode(T &data,int pry,pryNode<T> *next);
head->next=rear;
count=1;
}

//................................................................
template <class T>
pryNode<T> *pryQueue<T>::GetNode(T &data,int &pry,pryNode<T> *next)
{
pryNode<T> *temp;
temp=new pryNode<T>;
temp->data=data;
temp->pry=pry;
temp->next=next;
return temp;
}
template <class T>
pryQueue<T>::~pryQueue(void)
{
ClearQueue();
delete head;
head=NULL;
}
template <class T>
int pryQueue<T>::Length(void) const
{
return count;
}
template <class T>
int pryQueue<T>::Empty(void) const
{
return count==0;
}
template <class T>
T pryQueue<T>::Peek(void) const
{
if(head->next!=NULL)
return head->next->data;
else {
cerr<<"attempt to Peek a empty queue!"<<endl;
exit(1);
}
}
template <class T>
int pryQueue<T>::Insert(T data,int pry)
{
pryNode<T> *ptr=NULL,*pptr=NULL;
if(count==0)
{
rear=GetNode(data,pry,NULL);
head->next=rear;
count=1;
}
else if(count>0)
{
pptr=head;
ptr=head->next;
while(ptr->pry<pry&&ptr!=rear)
{
pptr=ptr;
ptr=ptr->next;
}
if(ptr==rear)
{
if(ptr->pry<pry)
{
ptr->next=GetNode(data,pry,NULL);
ptr=ptr->next;
rear=ptr;
}else
{
pptr->next=GetNode(data,pry,ptr);
pptr=pptr->next;
}
}else
{
pptr->next=GetNode(data,pry,ptr);
pptr=pptr->next;
}
count++;
}
else {
cerr<<"Error !"<<endl;
exit(1);
}
return 0;
}
template <class T>
T pryQueue<T>::Delete()
{
pryNode<T> *ptr;
if(count<=0)
{
cerr<<"pryQueue empty!"<<endl;exit(1);
}
T temp;
//从链表中找出优先级最高的元素返回其DATA并删除该结点
if(count==1)
{
temp=rear->data;
delete rear;
rear=NULL;
head->next=rear;
count=0;
}else
{
ptr=head->next;
temp=ptr->data;
head->next=ptr->next;
delete ptr;
count--;
}
return temp;
}
template <class T>
int pryQueue<T>::ClearQueue()
{
pryNode<T> *ptr;
while(head->next!=NULL)
{
ptr=head->next;
head->next=ptr->next;
delete ptr;
}
rear=NULL;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: