抽象数据类型(ADT)--队列的实现
时间:2010-08-01 来源:chengbin_liu
/* ************************************************************************
* Filename: queue.h
* Description: chengbin_liu
* Version: 1.0
* Created: 2010年08月01日 15时06分09秒
* Revision: none
* Compiler: gcc
* Author: YOUR NAME (),
* Company:
* ************************************************************************/ #ifndef _QUEUE_H_
#define _QUEUE_H_ #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> #define MAX 10
typedef struct item
{
int gumption;
int charisma;
}Item; typedef struct node
{
Item item;
struct node *next;
}Node; typedef struct queue
{
Node *front;
Node *rear;
int item;
}Queue; void InitializeQueue(Queue *pq);
bool QueueIsFull(const Queue *pq);
bool QueueIsEmpty(const Queue *pq);
int QueueItemCount(const Queue *pq);
bool DeQueue(Item *pitem,Queue *pq);//delete item from queue.
bool EnQueue(Item item,Queue *pq);//insert item to queue.
void EnptyQueue(Queue *pq); #endif
//=================================================================== /* ************************************************************************
* Filename: queue.c
* Description: chengbin_liu
* Version: 1.0
* Created: 2010年08月01日 15时15分04秒
* Revision: none
* Compiler: gcc
* Author: YOUR NAME (),
* Company:
* ************************************************************************/ #include "queue.h" static void CopyToNode(Item item, Node *pn);
static void CopyToItem(Node *pn,Item *pi);
void InitializeQueue(Queue *pq)
{
pq->front=pq->rear=NULL;
pq->item=0;
} bool QueueIsFull(const Queue *pq)
{
return pq->item==MAX;
}
bool QueueIsEmpty(const Queue *pq)
{
return pq->item==0;
}
int QueueItemCount(const Queue *pq)
{
return pq->item;
}
bool EnQueue(Item item,Queue *pq)
{
Node *pnew;
if(QueueIsFull(pq))
return false;
pnew=(Node *)malloc(sizeof(Node));
if(pnew==NULL)
{
fprintf(stderr,"unable to allocate memory!\n");
exit(1);
}
CopyToNode(item,pnew);
pnew->next=NULL;
if(QueueIsEmpty(pq))
pq->front=pnew;
else
pq->rear->next=pnew;
pq->rear=pnew;
pq->item++;
return true;
} bool DeQueue(Item *pitem,Queue *pq)
{
Node *pt;
if(QueueIsEmpty(pq))
return false;
CopyToItem(pq->front,pitem);
pt=pq->front;
pq->front=pq->front->next;
free(pt);
pq->item--;
if(pq->item==0)
pq->rear=NULL;
return true;
}
void EmptyTheQueue(Queue *pq)
{
Item dummy;
while(!QueueIsEmpty(pq))
DeQueue(&dummy,pq);
}
static void CopyToNode(Item item,Node *pn)
{
pn->item=item;
}
static void CopyToItem(Node *pn,Item *pi)
{
*pi=pn->item;
}
//==============================================================
* Filename: queue.h
* Description: chengbin_liu
* Version: 1.0
* Created: 2010年08月01日 15时06分09秒
* Revision: none
* Compiler: gcc
* Author: YOUR NAME (),
* Company:
* ************************************************************************/ #ifndef _QUEUE_H_
#define _QUEUE_H_ #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> #define MAX 10
typedef struct item
{
int gumption;
int charisma;
}Item; typedef struct node
{
Item item;
struct node *next;
}Node; typedef struct queue
{
Node *front;
Node *rear;
int item;
}Queue; void InitializeQueue(Queue *pq);
bool QueueIsFull(const Queue *pq);
bool QueueIsEmpty(const Queue *pq);
int QueueItemCount(const Queue *pq);
bool DeQueue(Item *pitem,Queue *pq);//delete item from queue.
bool EnQueue(Item item,Queue *pq);//insert item to queue.
void EnptyQueue(Queue *pq); #endif
//=================================================================== /* ************************************************************************
* Filename: queue.c
* Description: chengbin_liu
* Version: 1.0
* Created: 2010年08月01日 15时15分04秒
* Revision: none
* Compiler: gcc
* Author: YOUR NAME (),
* Company:
* ************************************************************************/ #include "queue.h" static void CopyToNode(Item item, Node *pn);
static void CopyToItem(Node *pn,Item *pi);
void InitializeQueue(Queue *pq)
{
pq->front=pq->rear=NULL;
pq->item=0;
} bool QueueIsFull(const Queue *pq)
{
return pq->item==MAX;
}
bool QueueIsEmpty(const Queue *pq)
{
return pq->item==0;
}
int QueueItemCount(const Queue *pq)
{
return pq->item;
}
bool EnQueue(Item item,Queue *pq)
{
Node *pnew;
if(QueueIsFull(pq))
return false;
pnew=(Node *)malloc(sizeof(Node));
if(pnew==NULL)
{
fprintf(stderr,"unable to allocate memory!\n");
exit(1);
}
CopyToNode(item,pnew);
pnew->next=NULL;
if(QueueIsEmpty(pq))
pq->front=pnew;
else
pq->rear->next=pnew;
pq->rear=pnew;
pq->item++;
return true;
} bool DeQueue(Item *pitem,Queue *pq)
{
Node *pt;
if(QueueIsEmpty(pq))
return false;
CopyToItem(pq->front,pitem);
pt=pq->front;
pq->front=pq->front->next;
free(pt);
pq->item--;
if(pq->item==0)
pq->rear=NULL;
return true;
}
void EmptyTheQueue(Queue *pq)
{
Item dummy;
while(!QueueIsEmpty(pq))
DeQueue(&dummy,pq);
}
static void CopyToNode(Item item,Node *pn)
{
pn->item=item;
}
static void CopyToItem(Node *pn,Item *pi)
{
*pi=pn->item;
}
//==============================================================
相关阅读 更多 +