|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 yuprxk 于 2012-6-18 17:38 编辑
/*linkqueue.h*/
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
typedef int BOOL;
typedef int ELEMENTTYPE;
typedef struct tag_NODE
{
ELEMENTTYPE data;
struct tag_NODE * next;
}NODE, *PNODE;
typedef struct tag_LINKQUEUE
{
PNODE front;
PNODE rear;
}LINKQUEUE, *PLINKQUEUE;
BOOL LinkQueueInit (PLINKQUEUE pLinkQueue)
{
PNODE pHeader = (PNODE) malloc (sizeof (NODE));
if (!pHeader)
{
printf ("LinkQueueInit: pHeader\n");
return FALSE;
}
pHeader->data = 0; //用作队列的长度,虽然程序没有用到
pHeader->next = NULL;
pLinkQueue->front = pHeader;
pLinkQueue->rear = pHeader;
return TRUE;
}
BOOL LinkQueueIn (PLINKQUEUE pLinkQueue, ELEMENTTYPE elementValue)
{
PNODE pNode = (PNODE) malloc (sizeof (NODE));
if (!pNode)
{
return FALSE;
}
pNode->data = elementValue;
pNode->next = NULL;
pLinkQueue->rear->next = pNode;
pLinkQueue->rear = pNode;
pLinkQueue->front->data ++;
return TRUE;
}
BOOL LinkQueueOut (PLINKQUEUE pLinkQueue, ELEMENTTYPE * pElementValue)
{
PNODE pOut;
if (pLinkQueue->rear == pLinkQueue->front) //要出队,必需确保队中有元素可出
{
return FALSE;
}
pOut = pLinkQueue->front->next;
if (pElementValue)
{
*pElementValue = pOut->data;
}
pLinkQueue->front->next = pOut->next;
free (pOut);
if (! pLinkQueue->front->next) //若删除后,队列为空,则改变rear的指向
{
pLinkQueue->rear = pLinkQueue->front;
}
pLinkQueue->front->data --;
return TRUE;
}
void LinkQueueDestroy (PLINKQUEUE pLinkQueue)
{
PNODE q;
PNODE p = pLinkQueue->front;
while (p)
{
q = p->next;
free (p);
p = q;
}
}
void LinkQueueShow (const PLINKQUEUE pLinkQueue)
{
PNODE p = pLinkQueue->front->next;
while (p)
{
printf (" %d ", p->data);
p = p->next;
}
}
//简单的测试
#include "linkqueue.h"
int main ()
{
int i;
LINKQUEUE lq;
LinkQueueInit (&lq); //初始化
for (i = 0; i < 9; i++)
{
LinkQueueIn (&lq, i);
LinkQueueShow (&lq);//每次入队的时候,都能立即看到结果
printf ("\n");
}
LinkQueueOut (&lq, NULL); //出队
LinkQueueShow (&lq);
printf ("\n");
LinkQueueDestroy (&lq); //不用了,就要销毁
}
|
|