队列使用单链表实现,另外设置两个指针一个指向队首,一个指向队尾。如果直接使用以前的带头节点的单链表,取队尾元素和入队的时间复杂度是O(N)。虽然可以采用循环链表,只设置一个指向尾节点的指针来解决,但是不是很好理解,所以我还是使用两个指针来实现^_^,代码比较简单

 /**//********************************************************************
/**//********************************************************************
 created:    2005/12/25
    created:    2005/12/25
 created:    25:12:2005   9:41
    created:    25:12:2005   9:41
 filename:     queue.h
    filename:     queue.h
 author:        Liu Qi, ngaut#126.com
    author:        Liu Qi, ngaut#126.com
 
    
 purpose:    链队列的定义与实现
    purpose:    链队列的定义与实现
 *********************************************************************/
*********************************************************************/

 #ifndef QUEUE_H
#ifndef QUEUE_H
 #define QUEUE_H
#define QUEUE_H


 #include <stdio.h>
#include <stdio.h>
 #include <stdbool.h>
#include <stdbool.h>
 #include <malloc.h>
#include <malloc.h>
 #include <assert.h>
#include <assert.h>


 typedef int ElemType;
typedef int ElemType;


 typedef struct
typedef struct


 {
{
 ElemType Element;
    ElemType Element;
 struct Node* Next;
    struct Node* Next;
 } Node;
} Node;

 typedef Node* PNode;
typedef Node* PNode;


 typedef struct
typedef struct


 {
{
 PNode front;
   PNode front;
 PNode rear;
   PNode rear;
 } Queue;
} Queue;



 /**//*===========================================================================
/**//*===========================================================================
 * Function name:    MakeNode
* Function name:    MakeNode
 * Parameter:        target:元素的值
* Parameter:        target:元素的值
 * Precondition:        void
* Precondition:        void
 * Description:        构造一个节点,其值为target,Next为NULL
* Description:        构造一个节点,其值为target,Next为NULL
 * Return value:        指向新节点的指针
* Return value:        指向新节点的指针
 * Author:            Liu Qi,  [12/25/2005]
* Author:            Liu Qi,  [12/25/2005]
 ===========================================================================*/
===========================================================================*/
 static PNode MakeNode(ElemType target)
static PNode MakeNode(ElemType target)


 {
{
 PNode PNewNode = (PNode) malloc(sizeof(Node));
    PNode PNewNode = (PNode) malloc(sizeof(Node));

 assert( NULL != PNewNode );
    assert( NULL != PNewNode ); 

 PNewNode->Element = target;
    PNewNode->Element = target;
 PNewNode->Next     = NULL;
    PNewNode->Next     = NULL;

 return PNewNode;
    return PNewNode;
 }
}



 /**//*===========================================================================
/**//*===========================================================================
 * Function name:    Q_Create
* Function name:    Q_Create
 * Parameter:        void
* Parameter:        void
 * Precondition:        void
* Precondition:        void
 * Description:        创建一个队列
* Description:        创建一个队列
 * Return value:        指向队列的指针
* Return value:        指向队列的指针
 * Author:            Liu Qi,  [12/25/2005]
* Author:            Liu Qi,  [12/25/2005]
 ===========================================================================*/
===========================================================================*/
 Queue* Q_Create( void )
Queue* Q_Create( void )


 {
{
 Queue *Q = (Queue *) malloc(sizeof(Queue));
    Queue *Q = (Queue *) malloc(sizeof(Queue));

 assert( NULL != Q );
    assert( NULL != Q ); 

 Q->front = NULL;
    Q->front = NULL;
 Q->rear     = NULL;
    Q->rear     = NULL;

 return Q;
    return Q;
 }
}



 /**//*===========================================================================
/**//*===========================================================================
 * Function name:    Q_IsEmpty
* Function name:    Q_IsEmpty
 * Parameter:        QPtr:指向队列的指针
* Parameter:        QPtr:指向队列的指针
 * Precondition:        NULL != QPtr
* Precondition:        NULL != QPtr
 * Description:        判断队列是否为空
* Description:        判断队列是否为空
 * Return value:        true:队列为空,false:队列不空
* Return value:        true:队列为空,false:队列不空
 * Author:            Liu Qi,  [12/25/2005]
* Author:            Liu Qi,  [12/25/2005]
 ===========================================================================*/
===========================================================================*/
 bool Q_IsEmpty(Queue* QPtr)
bool Q_IsEmpty(Queue* QPtr)


 {
{
 assert( NULL != QPtr );
    assert( NULL != QPtr ); 

 return (NULL == QPtr->front) ? true : false;
    return (NULL == QPtr->front) ? true : false;
 }
}




 /**//*===========================================================================
/**//*===========================================================================
 * Function name:    Q_PushBack
* Function name:    Q_PushBack
 * Parameter:        target:要入队的元素,QPtr:指向队列的指针
* Parameter:        target:要入队的元素,QPtr:指向队列的指针
 * Precondition:        NULL != QPtr
* Precondition:        NULL != QPtr
 * Description:        入队
* Description:        入队
 * Return value:        void
* Return value:        void
 * Author:            Liu Qi,  [12/25/2005]
* Author:            Liu Qi,  [12/25/2005]
 ===========================================================================*/
===========================================================================*/
 void Q_PushBack(ElemType target, Queue* QPtr)
void Q_PushBack(ElemType target, Queue* QPtr)


 {
{
 PNode PNewNode = MakeNode(target);
    PNode PNewNode = MakeNode(target);

 assert( NULL != QPtr );
    assert( NULL != QPtr ); 
 
    
 if ( !Q_IsEmpty(QPtr))    //队列不为空,直接链接到队列尾部
    if ( !Q_IsEmpty(QPtr))    //队列不为空,直接链接到队列尾部

 
     {
{
 QPtr->rear->Next = PNewNode;
        QPtr->rear->Next = PNewNode;
 QPtr->rear = PNewNode;
        QPtr->rear = PNewNode;
 }
    }
 else
    else

 
     {    //队列为空
{    //队列为空
 QPtr->front = PNewNode;
        QPtr->front = PNewNode;
 QPtr->rear = PNewNode;
        QPtr->rear = PNewNode;
 }
    }
 }
}




 /**//*===========================================================================
/**//*===========================================================================
 * Function name:    Q_PopFront
* Function name:    Q_PopFront
 * Parameter:        QPtr:指向队列的指针
* Parameter:        QPtr:指向队列的指针
 * Precondition:        NULL != QPtr && !Q_IsEmpty(QPtr)
* Precondition:        NULL != QPtr && !Q_IsEmpty(QPtr)
 * Description:        从队首出队
* Description:        从队首出队
 * Return value:        元素的值
* Return value:        元素的值
 * Author:            Liu Qi,  [12/25/2005]
* Author:            Liu Qi,  [12/25/2005]
 ===========================================================================*/
===========================================================================*/
 void Q_PopFront(Queue *QPtr)
void Q_PopFront(Queue *QPtr)    


 {
{
 PNode PTmp;
    PNode PTmp;

 assert( NULL != QPtr && !Q_IsEmpty(QPtr));
    assert( NULL != QPtr && !Q_IsEmpty(QPtr)); 

 PTmp = QPtr->front;
    PTmp = QPtr->front;
 QPtr->front = PTmp->Next;
    QPtr->front = PTmp->Next;
 free(PTmp);
    free(PTmp);
 }
}



 /**//*===========================================================================
/**//*===========================================================================
 * Function name:    Q_Front
* Function name:    Q_Front
 * Parameter:        QPtr:指向队列的指针
* Parameter:        QPtr:指向队列的指针
 * Precondition:        NULL != QPtr && !Q_IsEmpty(QPtr)
* Precondition:        NULL != QPtr && !Q_IsEmpty(QPtr)
 * Description:        返回队首的第一个元素的值
* Description:        返回队首的第一个元素的值
 * Return value:        队首的第一个元素的值
* Return value:        队首的第一个元素的值
 * Author:            Liu Qi,  [12/25/2005]
* Author:            Liu Qi,  [12/25/2005]
 ===========================================================================*/
===========================================================================*/
 ElemType Q_Front(Queue *QPtr)    //个人觉得该函数返回指针更具通用性
ElemType Q_Front(Queue *QPtr)    //个人觉得该函数返回指针更具通用性


 {
{
 assert( NULL != QPtr && !Q_IsEmpty(QPtr) );
    assert( NULL != QPtr && !Q_IsEmpty(QPtr) ); 

 return QPtr->front->Element;
    return QPtr->front->Element;
 }
}



 /**//*===========================================================================
/**//*===========================================================================
 * Function name:    Q_Back
* Function name:    Q_Back
 * Parameter:        QPtr:指向队列的指针
* Parameter:        QPtr:指向队列的指针
 * Precondition:        NULL != QPtr && !Q_IsEmpty(QPtr)
* Precondition:        NULL != QPtr && !Q_IsEmpty(QPtr)
 * Description:        返回队尾最后一个元素的值
* Description:        返回队尾最后一个元素的值
 * Return value:        队尾最后一个元素的值
* Return value:        队尾最后一个元素的值
 * Author:            Liu Qi,  [12/25/2005]
* Author:            Liu Qi,  [12/25/2005]
 ===========================================================================*/
===========================================================================*/
 ElemType Q_Back(Queue *QPtr)    //个人觉得该函数返回指针更具通用性
ElemType Q_Back(Queue *QPtr)    //个人觉得该函数返回指针更具通用性


 {
{
 assert( NULL != QPtr && !Q_IsEmpty(QPtr) );
    assert( NULL != QPtr && !Q_IsEmpty(QPtr) ); 

 return QPtr->rear->Element;
    return QPtr->rear->Element;
 }
}



 /**//*===========================================================================
/**//*===========================================================================
 * Function name:    Q_Destory
* Function name:    Q_Destory
 * Parameter:        QPtr:指向队列的指针
* Parameter:        QPtr:指向队列的指针
 * Precondition:        NULL != QPtr
* Precondition:        NULL != QPtr
 * Description:        销毁队列,并释放空间
* Description:        销毁队列,并释放空间
 * Return value:        void
* Return value:        void
 * Author:            Liu Qi,  [12/25/2005]
* Author:            Liu Qi,  [12/25/2005]
 ===========================================================================*/
===========================================================================*/
 void Q_Destory(Queue *QPtr)
void Q_Destory(Queue *QPtr)


 {
{
 assert( NULL != QPtr );
    assert( NULL != QPtr ); 

 while ( !Q_IsEmpty(QPtr) )
    while ( !Q_IsEmpty(QPtr) )

 
     {
{
 Q_PopFront(QPtr);
        Q_PopFront(QPtr);
 }
    }

 free(QPtr);
    free(QPtr);
 }
}

 #endif
#endif

测试代码如下:
 #include <stdio.h>
#include <stdio.h>
 #include "queue.h"
#include "queue.h"


 #define MAX_CNT 10
#define MAX_CNT 10

 int main()
int main()


 {
{
 int i;
    int i;

 Queue *QPtr = Q_Create();
    Queue *QPtr = Q_Create();

 for (i = 0; i < MAX_CNT; i++)
    for (i = 0; i < MAX_CNT; i++)

 
     {
{
 Q_PushBack(i, QPtr);
        Q_PushBack(i, QPtr);
 printf("Q->front: %d\n", Q_Front(QPtr));
        printf("Q->front: %d\n", Q_Front(QPtr));
 printf("Q->rear:  %d\n", Q_Back(QPtr));
        printf("Q->rear:  %d\n", Q_Back(QPtr));
 }
    }

 printf("\n");
    printf("\n");

 for (i = 0; i < MAX_CNT; i++)
    for (i = 0; i < MAX_CNT; i++)

 
     {
{
 Q_PopFront(QPtr);
        Q_PopFront(QPtr);
 if ( !Q_IsEmpty(QPtr) )
        if ( !Q_IsEmpty(QPtr) )

 
         {
{
 printf("Q->front: %d\n", Q_Front(QPtr));
            printf("Q->front: %d\n", Q_Front(QPtr));
 printf("Q->rear:  %d\n", Q_Back(QPtr));
            printf("Q->rear:  %d\n", Q_Back(QPtr));
 }
        }
 }
    }

 Q_Destory(QPtr);
    Q_Destory(QPtr);
 
    
 return 0;
    return 0;
 }
}

明天该学串了,高兴ing......