队列的链式存储
与栈相反,队列是一种先进先出(FIFO)的线性表 FIFO:first in first out
c语言实现,bool,引用为c++中先忽略
#include<stdio.h>
#include<malloc.h>
using namespace std;
typedef int ElemType;
typedef struct QNode{ //结点的定义
ElemType data;
QNode *next;
}QNode,*QueuePtr;
typedef struct //链式存储队列的定义
{
QueuePtr front; //头指针
QueuePtr rear; //尾指针
}LinkQueue;
bool InitQueue(LinkQueue &Q) //队列的初始化
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front) return false;
Q.front->next=NULL;
return true;
}
bool EmptyQueue(LinkQueue Q) //判断队列是否为空
{
if(Q.front==Q.rear) return true;
else return false;
}
int GetNumber(LinkQueue Q) //返回队列元素个数
{
int count=1;
QueuePtr q=Q.front->next; //将q指向第一个元素的结点
while(q!=NULL)
{
q=q->next;
count++;
}
return count;
}
bool ClearQueue(LinkQueue &Q) //清空队列
{
QueuePtr q=Q.front->next;
if(!q) return false;
while(q!=NULL)
{
free(Q.front); //释放结点
Q.front=q;
q=q->next;
}
return true;
}
bool DestoryQueue(LinkQueue &Q){
QueuePtr q=Q.front;
if(!q) return false;
while(q!=NULL)
{
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
return true;
}
return true;
}
bool EnQueue(LinkQueue &Q,ElemType elem) //入队
{
QueuePtr q=(QueuePtr)malloc(sizeof(QNode)); //初始化新结点
if(!q) return false;
q->next=NULL; //指针域赋空
q->data=elem;
Q.rear->next=q; //链接q结点
Q.rear=q; //移动尾指针
return true;
}
bool DeQueue(LinkQueue &Q,ElemType &elem) //出队
{
QueuePtr q=Q.front->next;
if(!q) return false;
Q.front=q->next;
elem=q->data;
free(q); //释放结点
return true;
}
void QueueTraverse(LinkQueue Q) //队列的遍历
{
QueuePtr q=Q.front->next;
while(q!=NULL)
{
printf("%3i",q->data);
q=q->next;
}
printf("\n");
}
int main()
{
int elem1=1;
int elem2=2;
int elem3=3;
LinkQueue Q;
InitQueue(Q);
EnQueue(Q,elem1);
EnQueue(Q,elem2);
EnQueue(Q,elem3);
printf("队列元素个数 %i\n",GetNumber(Q));
printf("队列的遍历:");
QueueTraverse(Q);
ClearQueue(Q);
if(EmptyQueue(Q)) printf("队空");
DestoryQueue(Q);
return 0;
}