[庫]泛型隊列

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.