结点结构体:
template<class ElemType>
struct Node {
ElemType data;
Node<ElemType>* next;
Node();
Node(const ElemType& e, Node<ElemType>* Link = NULL);
};
template<class ElemType>
Node<ElemType>::Node() {
next = NULL;
}
template<class ElemType>
Node<ElemType>::Node(const ElemType& e, Node<ElemType>* link) {
data = e;
next = link;
}
队列:
template<class ElemType>
class LinkQueue //链队列
{
protected:
//数据成员
Node<ElemType>* front, * rear;//队头队尾指针
int count;
public:
LinkQueue();
void Traverse(void(*visit)(const ElemType&))const;
virtual ~LinkQueue();
int Length()const;
bool InQueue(const ElemType& e);
bool OutQueue(ElemType& e);
bool OutQueue();
void Clear();
bool Empty()const;
};
template<class ElemType>
LinkQueue<ElemType>::LinkQueue()
{
rear = front = new Node<ElemType>;
count = 0;
}
template<class ElemType>
void LinkQueue<ElemType>::Clear()
{
while (!Empty())
{
OutQueue();
}
}
template<class ElemType>
bool LinkQueue<ElemType>::Empty()const
{
return count == 0;
}
template<class ElemType>
LinkQueue<ElemType>::~LinkQueue()
{
Clear();
delete front;
}
template<class ElemType>
int LinkQueue<ElemType>::Length()const
{
return count;
}
template<class ElemType>
bool LinkQueue<ElemType>::InQueue(const ElemType& e)
{
Node<ElemType>* temPtr = new Node<ElemType>(e);
if (temPtr == NULL)
{
return false;
}
else
{
rear->next = temPtr;
rear = temPtr;
count++;
return true;
}
}
template<class ElemType>
bool LinkQueue<ElemType>::OutQueue(ElemType& e)
{
if (!Empty())
{
Node<ElemType>* temPtr = front->next;
e = temPtr->data;
front->next = temPtr->next;
if (rear == temPtr)
{
rear = front;
}
delete temPtr;
count--;
return true;
}
else
{
return false;
}
}
template<class ElemType>
bool LinkQueue<ElemType>::OutQueue()
{
if (!Empty())
{
Node<ElemType>* temPtr = front->next;
front->next = temPtr->next;
if (rear == temPtr)
{
rear = front;
}
delete temPtr;
count--;
return true;
}
else
{
return false;
}
}
template<class ElemType>
void LinkQueue<ElemType>::Traverse(void(*visit)(const ElemType&))const {
for (Node<ElemType>*temptr=front->next;temptr!=NULL;temptr=temptr->next){
(*visit)(temptr->data);
}
}