(一)
队列(FIFO)先进先出模式,包含初,毁,清,空,长,得,进,出。八种基本操作。现以两种存储方式为例,来讲解队列的用法。
(二)
单 链式存储结构
//----头文件-----
#include<stdio.h>
#include<stdlib.h>
//-----宏定义-----
#define TURE 1
#define ERROR 0
#define OVERFLOW -2
//-----结构体及替换-----
typedef int Bool;
typedef struct QNode
{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
壹。初(初始化队列)
(图1)
Bool InitQueue(LinkQueue *Q)
{
if(!(Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode))))
{
exit(OVERFLOW);
}
Q->front->next=NULL;
return TURE;
}
贰。 毁(销毁队列)
Bool DestroyQuueue(LinkQueue *Q)
{
while(Q->front)
{
Q->rear=Q->front->next;
free(Q->front);
Q->front=Q->rear;
}
return TURE;
}
叁。清(清空队列)
Bool ClearQueue(LinkQueue *Q)
{
if(Q->front!=Q->rear)
{
Q->rear=Q->front;
Q->front=NULL;
}
return TURE;
}
肆。空(判断空队列)
Bool QueueEmpty(LinkQueue Q)
{
return Q.front==Q.rear?TURE:ERROR;
}
伍。长(返回队列长)
int QueueLength(LinkQueue Q)
{
int length=0;
QueuePtr PStart=Q.front->next;
while(Q.rear!=PStart)
{
length++;
PStart=PStart->next;
}
return length;
}
陆。得(得到队列头)
Bool GetHead(LinkQueue Q,int *e)
{
if(Q.front==Q.rear)
{
return ERROR;
}
*e=Q.front->data;
return TURE;
}
柒。进(进入队列)
Bool EnQueue(LinkQueue *Q,int e)
{
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
{
exit(OVERFLOW);
}
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
return TURE;
}
捌。出(走出队列)
Bool DeQueue(LinkQueue *Q,int *e)
{
QueuePtr p;
if(Q->front==Q->rear)
{
return ERROR;
}
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p)
{
Q->rear=Q->rear;
}
free(p);
return TURE;
}