#include
using namespace std;
//節點類
template
struct QNode
{
T data;
QNode *next;
};
//隊列類
template
struct LinkList
{
QNode * front;
QNode * rear;
size_t size;
};
//構造一個空隊列
template
void InitQueue(LinkList & que)
{
que.front = (QNode *)malloc(sizeof(QNode));
if(!que.front) exit(0);
que.size = 0;
que.rear = que.front;
que.rear->next = 0;
}
//銷毀隊列
template
void DestroyQueue(LinkList& que)
{
QNode * p = que.front->next;
free(que.front);
while(p != 0)
{
que.front = p->next;
free(p);
p = que.front;
}
}
//清空隊列
template
void ClearQueue(LinkList& que)
{
QNode * p = que.front->next;
while(p != 0)
{
que.rear = p->next;
free(p);
p = que.rear;
}
que.rear = que.front;
que.front->next = 0;
que.size = 0;
}
//返回隊列的長度
template
int QueueLength(LinkList& que)
{
return que.size;
}
//返回隊列的隊首元素
template
T GetHead(LinkList& que)
{
return que.front->next->data;
}
//元素入隊
template
void EnQueue(LinkList& que,T t)
{
QNode *p = (QNode*)malloc(sizeof(QNode));
if(!p) exit(0);
p->data = t;
p->next = 0;
que.rear->next = p;
que.rear = p;
que.size++;
}
//元素出隊
template
bool DeQueue(LinkList& que,T & t)
{
if(que.size==0)
return false;
QNode *p = que.front->next;
que.front->next = p->next;
que.size--;
t = p->data;
free(p);
return true;
}
//從對頭到隊尾元素遍歷調用visit函數
template
void VisitQueue(LinkList& que,void (*visit)(T &t))
{
QNode *p = que.front->next;
while(p != 0)
{
(*visit)(p->data);
p = p->next;
}
}
//測試函數
template
void Print(T &t)
{
cout<
void AddOne(T &t)
{
t++;
}
int main()
{
//創建一個空的隊列
LinkList queue;
//初始化隊列
InitQueue(queue);
//元素入隊
EnQueue(queue,1);
EnQueue(queue,2);
EnQueue(queue,3);
EnQueue(queue,4);
//返回隊列的長度
cout<<"隊列的長度: "<);
//返回隊列的隊首元素
cout<<"隊列的隊首元素: "<);
//輸出所有元素
VisitQueue(queue,Print);
//清空隊列
ClearQueue(queue);
//銷毀隊列
DestroyQueue(queue);
}