用链表实现优先级队列

//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;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值