队列

队列是先进先出的数据结构,出队的一端叫队首,入队的一端叫队尾,就像是日常生活中排队买火车票一样,先买完的人先出队,也就是我们常说的先进先出。

头文件:


/***************************************************************************************************** 
 *Copyright:Yue Workstation 
 * 
 *FileName:Queue.h 
 * 
 *Function:队列相关数据定义和函数声明 
 * 
 *Author:Abel Lee 
 * 
 *CreateOn:2011-7-21 
 * 
 *Log:2011-7-21 由Lijian创建 
 *****************************************************************************************************/ 

#ifndef QUEUE_H 
#define QUEUE_H 

#include "global.h" 

typedef int QElemType; 

typedef struct QNode 
{ 
    QElemType data; 
    struct QNode *next; 
}QNode,*QueuePtr; 

typedef struct 
{ 
    QueuePtr front; 
    QueuePtr rear; 
}LinkQueue; 

int InitQueue(LinkQueue *Q); 
int DestroyQueue(LinkQueue *Q); 
int QueueEmpty(LinkQueue Q); 
int QueueLength(LinkQueue Q); 
int GetHead(LinkQueue Q,QElemType *e); 
int InsertQueue(LinkQueue *Q,QElemType e); 
int DelQueue(LinkQueue *Q,QElemType *e); 
int PrintQueue(LinkQueue Q); 

#endif

源文件:

/***************************************************************************************************** 
 *Copyright:Yue Workstation 
 * 
 *FileName:Queue.c 
 * 
 *Function:队列基本操作 
 * 
 *Author:Abel Lee 
 * 
 *CreateOn:2011-7-21 
 * 
 *Log:2011-5-3 由Abel Lee创建 
 *****************************************************************************************************/ 

#include "../inc/Queue.h" 

/**************************************************************************************************** 
 *Function Name:InitQueue 
 * 
 *Function:初始化一个队列 
 * 
 *Parameter:     Q:队列的首部 
 * 
 *Return Value:成功返回0,失败返回-1 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-7-21 
 ***************************************************************************************************/ 
int InitQueue(LinkQueue *Q) 
{ 
    Q->front = Q->rear = (QueuePtr )malloc(sizeof(QNode)); 
    if(!Q->front) 
    { 
        perror("malloc error\n"); 
        return -1; 
    } 
    Q->front->next = NULL; 
    Q->front->data = 0; 
    return 0; 
} 

/**************************************************************************************************** 
 *Function Name:DestroyQueue 
 * 
 *Function:销毁一个队列 
 * 
 *Parameter:     Q:队列的首部 
 * 
 *Return Value:成功返回0 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-7-21 
 ***************************************************************************************************/ 
int DestroyQueue(LinkQueue *Q) 
{ 
    while(Q->front) 
    { 
        Q->rear = Q->front->next; 
        free(Q->front); 
        Q->front = Q->rear; 
    } 

    Q = NULL; 
    return 0; 
} 

/**************************************************************************************************** 
 *Function Name:QueueEmpty 
 * 
 *Function:队列是否为空 
 * 
 *Parameter:     Q:队列的首部 
 * 
 *Return Value:队列为空返回1,非空返回0 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-7-21 
 ***************************************************************************************************/ 
int QueueEmpty(LinkQueue Q) 
{ 
    if(Q.front == Q.rear) 
    { 
        return 1; 
    } 
    else 
    { 
        return 0; 
    } 
} 

/**************************************************************************************************** 
 *Function Name:QueueLength 
 * 
 *Function:队列长度 
 * 
 *Parameter:     Q:队列的首部 
 * 
 *Return Value:队列的长度 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-7-21 
 ***************************************************************************************************/ 
int QueueLength(LinkQueue Q) 
{ 
    return Q.front->data; 
} 

/**************************************************************************************************** 
 *Function Name:GetHead 
 * 
 *Function:获取队列头元素 
 * 
 *Parameter:     Q:队列的首部 
 *               e:保存队首元素 
 * 
 *Return Value:成功返回0,失败返回-1 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-7-21 
 ***************************************************************************************************/ 
int GetHead(LinkQueue Q,QElemType *e) 
{ 
    if(Q.front->next == NULL) 
    { 
        perror("Queue is empty!\n"); 
        *e = -1; 
        return -1; 
    } 
    *e = Q.front->next->data; 
    return 0; 
} 

/**************************************************************************************************** 
 *Function Name:InsertQueue 
 * 
 *Function:入队操作,入队元素为e 
 * 
 *Parameter:     Q:队列的首部 
 *                 e:入队元素 
 * 
 *Return Value:成功返回0,失败返回-1 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-7-21 
 ***************************************************************************************************/ 
int InsertQueue(LinkQueue *Q,QElemType e) 
{ 
    QueuePtr p = (QueuePtr )malloc(sizeof(QNode)); 
    if(p == NULL) 
    { 
        perror("malloc error!\n"); 
        return -1; 
    } 

    p->data = e; 
    p->next = NULL; 
    (Q->rear)->next = p; 
    Q->rear = p; 

    Q->front->data++; 
    return 0; 
} 

/**************************************************************************************************** 
 *Function Name:DelQueue 
 * 
 *Function:出队操作,出队的元素保存在e中 
 * 
 *Parameter:     Q:队列的首部 
 *                 e:出队元素 
 * 
 *Return Value:成功返回0,失败返回-1 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-7-21 
 ***************************************************************************************************/ 
int DelQueue(LinkQueue *Q,QElemType *e) 
{ 
    if(Q->front == Q->rear) 
    { 
        perror("The queue is empty!"); 
        return -1; 
    } 

    QueuePtr p = (QueuePtr )malloc(sizeof(QNode)); 
    p = Q->front->next; 
    *e = p->data; 
    Q->front->next = p->next; 
    if(Q->rear == p) 
    { 
        Q->rear = Q->front; 
    } 
    free(p); 
    Q->front->data--; 
    return 0; 
} 

/**************************************************************************************************** 
 *Function Name:PrintQueue 
 * 
 *Function:打印队列中的元素 
 * 
 *Parameter:     Q:队列的首部 
 * 
 *Return Value:成功返回0 
 * 
 *Author:Abel Lee 
 * 
 *Log:2011-7-21 
 ***************************************************************************************************/ 
int PrintQueue(LinkQueue Q) 
{ 
    Q.front = Q.front->next; 
    while(Q.front != NULL) 
    { 
        printf("%d-----",Q.front->data); 
        Q.front = Q.front->next; 
    } 
    return 0; 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章