### [库]泛型队列

/*
Author:avalon qq:1243128
Date: 05-10-04 21:18
Description:泛型队列
*/

#ifndef  AVALON_QUEUE_H
#define  AVALON_QUEUE_H

#ifndef  AVA_BOOL
#define  AVA_BOOL
#define  TRUE      1
#define  FALSE     0
typedef  int    BOOL;
#endif

extern LHandle InitQueue(size_t type);
/*构造*/
extern BOOL  QueueEmpty(LHandle q);
/*empty?*/
extern int   QueueLength(LHandle q);
/*length*/
extern BOOL  GetHead(LHandle q, void * elem);
/*若队列不为空,则COPY队头元素,并返回TRUE*/
extern BOOL  EnQueue(LHandle q,void * elem);
/*插入元素elem为新的队尾元素*/
extern BOOL DeQueue(LHandle q,void * elem);
/*如elem不为空,则将删除后的头结点值赋值给elem,返回TRUE*/
extern BOOL ClearQueue(LHandle q);
/*清空*/
extern BOOL DestroyQueue(LHandle * q);
/*销毁*/
#endif

//////////////////////

///////////////////

/*
Author:avalon qq:1243128
Date: 05-10-04 21:18
Description:泛型队列
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#ifndef  AVA_BOOL
#define  AVA_BOOL
#define  TRUE      1
#define  FALSE     0
typedef  int    BOOL;
#endif

typedef struct Node{
void         *  data;/*数据指针*/
struct Node  *  next;/*下一结点*/
}Node , *NHandle;

NHandle  front;/*头指针*/
NHandle  rear ;/*尾指针*/
int      size ;/*长度*/
size_t   type ;
/*

*/
static  NHandle AllocNode(LHandle S,void * elem)
{/*分配结点*/
NHandle node_temp = (NHandle)malloc(sizeof(Node));
void  * data_temp ;
assert(NULL !=node_temp);
assert(NULL !=S);
assert(NULL !=elem);
data_temp = malloc(S->type);
assert(NULL !=data_temp);
memcpy(data_temp,elem,S->type);/*copy data*/
node_temp->data = data_temp;   /*member data 赋值*/

return node_temp;
}
static BOOL  FreeNode(NHandle * node)
{/*释放结点*/
free( (*node)->data);
free( *node);
return TRUE;
}
/*

*/
extern LHandle InitQueue(size_t type)
{/*构造*/
assert(NULL !=temp);
temp->front = temp->rear =NULL;
temp->size  = 0;
temp->type  = type;
return temp;
}
extern BOOL  QueueEmpty(LHandle q)
{/*empty?*/
assert(NULL !=q);
return ( 0==q->size)?TRUE:FALSE;
}
extern int   QueueLength(LHandle q)
{/*length*/
assert(NULL !=q);
return q->size;
}
extern BOOL  GetHead(LHandle q, void * elem)
{/*若队列不为空,则COPY队头元素,并返回TRUE*/
assert(NULL !=q);
assert(NULL !=elem);
if(NULL== q->front)return FALSE;
memcpy(elem,q->front->data,q->type);
return TRUE;
}
extern BOOL  EnQueue(LHandle q,void * elem)
{/*插入元素elem为新的队尾元素*/
NHandle temp ;
assert(NULL !=q);
assert(NULL !=elem);
temp = AllocNode(q,elem);
/**/
if((q->size)++ != 0){/*长度加1*/
q->rear->next = temp;
q->rear = q->rear->next;
}
else{
q->front=q->rear=temp;
}
return TRUE;
}
extern BOOL DeQueue(LHandle q,void * elem)
{/*如elem不为空,则将删除后的头结点值赋值给elem,返回TRUE*/
NHandle temp;
assert(NULL !=q);
if(0==q->size)return FALSE;
temp= q->front->next;/*新的队头*/

if(NULL!=elem)/*拷贝到elem*/
memcpy(elem,q->front,q->type);
FreeNode( &(q->front));
if( (q->size)-- !=1){
q->front = temp;
}
else{
q->front =q->rear =NULL;
}
return TRUE;
}
extern BOOL ClearQueue(LHandle q)
{/*清空*/
assert(NULL !=q);
while(0 !=q->size)
DeQueue(q,NULL);
return TRUE;
}
extern BOOL DestroyQueue(LHandle * q)
{/*销毁*/
assert(q);
assert(*q);
ClearQueue(*q);
free(*q);
return TRUE;
}

0 0