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

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


#ifndef QUEUE_H
#define  QUEUE_H


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


typedef 
int  ElemType;


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

typedef Node
*  PNode;


typedef 
struct
{
   PNode front;
   PNode rear;
}
 Queue;


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

static  PNode MakeNode(ElemType target)
{
    PNode PNewNode 
= (PNode) malloc(sizeof(Node));

    assert( NULL 
!= PNewNode ); 

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

    
return PNewNode;
}



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

Queue
*  Q_Create(  void  )
{
    Queue 
*= (Queue *) malloc(sizeof(Queue));

    assert( NULL 
!= Q ); 

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

    
return Q;
}



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

bool  Q_IsEmpty(Queue *  QPtr)
{
    assert( NULL 
!= QPtr ); 

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




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

void  Q_PushBack(ElemType target, Queue *  QPtr)
{
    PNode PNewNode 
= MakeNode(target);

    assert( NULL 
!= QPtr ); 
    
    
if ( !Q_IsEmpty(QPtr))    //队列不为空,直接链接到队列尾部
    {
        QPtr
->rear->Next = PNewNode;
        QPtr
->rear = PNewNode;
    }

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

}




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

void  Q_PopFront(Queue  * QPtr)    
{
    PNode PTmp;

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

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



/**/ /*===========================================================================
* Function name:    Q_Front
* Parameter:        QPtr:指向队列的指针
* Precondition:        NULL != QPtr && !Q_IsEmpty(QPtr)
* Description:        返回队首的第一个元素的值
* Return value:        队首的第一个元素的值
* Author:            Liu Qi,  [12/25/2005]
===========================================================================
*/

ElemType Q_Front(Queue 
* QPtr)     // 个人觉得该函数返回指针更具通用性
{
    assert( NULL 
!= QPtr && !Q_IsEmpty(QPtr) ); 

    
return QPtr->front->Element;
}



/**/ /*===========================================================================
* Function name:    Q_Back
* Parameter:        QPtr:指向队列的指针
* Precondition:        NULL != QPtr && !Q_IsEmpty(QPtr)
* Description:        返回队尾最后一个元素的值
* Return value:        队尾最后一个元素的值
* Author:            Liu Qi,  [12/25/2005]
===========================================================================
*/

ElemType Q_Back(Queue 
* QPtr)     // 个人觉得该函数返回指针更具通用性
{
    assert( NULL 
!= QPtr && !Q_IsEmpty(QPtr) ); 

    
return QPtr->rear->Element;
}



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

void  Q_Destory(Queue  * QPtr)
{
    assert( NULL 
!= QPtr ); 

    
while ( !Q_IsEmpty(QPtr) )
    
{
        Q_PopFront(QPtr);
    }


    free(QPtr);
}


#endif


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


#define  MAX_CNT 10

int  main()
{
    
int i;

    Queue 
*QPtr = Q_Create();

    
for (i = 0; i < MAX_CNT; i++)
    
{
        Q_PushBack(i, QPtr);
        printf(
"Q->front: %d\n", Q_Front(QPtr));
        printf(
"Q->rear:  %d\n", Q_Back(QPtr));
    }


    printf(
"\n");

    
for (i = 0; i < MAX_CNT; i++)
    
{
        Q_PopFront(QPtr);
        
if ( !Q_IsEmpty(QPtr) )
        
{
            printf(
"Q->front: %d\n", Q_Front(QPtr));
            printf(
"Q->rear:  %d\n", Q_Back(QPtr));
        }

    }


    Q_Destory(QPtr);
    
    
return 0;
}

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