链式队列实现起来很简单。
唯一需要注意的是:
在入队和出队时,需要分别处理一下队头和队尾为空的情况。
/*
** File name: LinkQueue.h
** Author: ZhouFeng
** Date: 2012/03/28
*/
#ifndef LINK_QUEUE_H
#define LINK_QUEUE_H
#define BOOL int
#define FALSE 0
#define TRUE 1
#define ERROR 0
#define SUCCESS 1
typedef int EleType;
typedef struct LQNode
{
EleType data;
struct LQNode *pNext;
}LQNode;
typedef struct LinkQueue
{
LQNode *pFront;
LQNode *pRear;
}LinkQueue;
void InitLinkQueue(LinkQueue *LQ);
BOOL IsLinkQueueEmpty(LinkQueue *LQ);
int LinkQueueAppend(LinkQueue *LQ, EleType data);
int LinkQueueDelete(LinkQueue *LQ, EleType *pData);
int GetQueue(LinkQueue *LQ, EleType *pData);
void FreeQueue(LinkQueue *LQ);
#endif
/*
** File name: LinkQueue.c
** Author: ZhouFeng
** Date: 2012/03/28
*/
#include <stdlib.h>
#include <stddef.h>
#include "LinkQueue.h"
void InitLinkQueue(LinkQueue *LQ)
{
if(LQ == NULL)
{
return;
}
LQ->pFront = NULL;
LQ->pRear = NULL;
}
BOOL IsLinkQueueEmpty(LinkQueue *LQ)
{
if(LQ == NULL)
{
return TRUE;
}
if(LQ->pFront == NULL)
{
return TRUE;
}
else
{
return FALSE;
}
}
int LinkQueueAppend(LinkQueue *LQ, EleType data)
{
LQNode *pNewNode;
if(LQ == NULL)
{
return ERROR;
}
pNewNode = (LQNode*)malloc(sizeof(LQNode));
pNewNode->data = data;
pNewNode->pNext = NULL;
if(LQ->pRear != NULL)
{
LQ->pRear->pNext = pNewNode;
}
LQ->pRear = pNewNode;
if(LQ->pFront == NULL)
{
LQ->pFront = pNewNode;
}
return SUCCESS;
}
int LinkQueueDelete(LinkQueue *LQ, EleType *data)
{
LQNode *pDel;
if(LQ == NULL || data == NULL)
{
return ERROR;
}
if(LQ->pFront == NULL)
{
return ERROR;
}
*data = LQ->pFront->data;
pDel = LQ->pFront;
LQ->pFront = LQ->pFront->pNext;
if(LQ->pFront == NULL)
{
LQ->pRear = NULL;
}
free(pDel);
return SUCCESS;
}
int GetQueue(LinkQueue *LQ, EleType *pData)
{
if(LQ == NULL || LQ->pFront == NULL || pData == NULL)
{
return ERROR;
}
*pData = LQ->pFront->data;
return SUCCESS;
}
void FreeQueue(LinkQueue *LQ)
{
LQNode *pDel;
if(LQ == NULL)
{
return;
}
while(LQ->pFront != NULL)
{
pDel = LQ->pFront;
LQ->pFront = LQ->pFront->pNext;
free(pDel);
}
LQ->pRear = LQ->pFront = NULL;
}