编程语言

img avalonBBS

[库]泛型队列

发表于2004/10/5 21:16:00  1432人阅读

分类: 数据结构手札

/*
  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

typedef struct Link * LHandle;

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;

typedef struct Link{
    NHandle  front;/*头指针*/
    NHandle  rear ;/*尾指针*/
    int      size ;/*长度*/
    size_t   type ;
}Link , *LHandle;
/*
内部函数
*/
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)
{/*构造*/
 LHandle temp = (LHandle)malloc(sizeof(Link));
 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

相关文章推荐

img
取 消
img