純C語言實現順序隊列

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 6

typedef int QElemType;

typedef struct {
    QElemType *base;
    int front;
    int rear;
}SqQueue;

SqQueue *InitQueue(SqQueue* Q);//初始化
SqQueue *DestroyQueue(SqQueue* Q);//銷燬
void ClearQueue(SqQueue *Q);//清空
int QueueEmpty(SqQueue *Q);//判空
int QueueLength(SqQueue *Q);//隊列長度
QElemType GetHead(SqQueue *Q);//獲取隊頭元素
int EnQueue(SqQueue *Q, QElemType e);//插入新元素到隊尾
int DeQueue(SqQueue *Q, QElemType *e);//刪除隊頭元素
void QueueTraverse(SqQueue *Q);//遍歷

//初始化
SqQueue *InitQueue(SqQueue* Q){
    Q = (SqQueue *)malloc(sizeof(SqQueue));
    Q->base = (QElemType *)malloc(sizeof(QElemType)*MAXSIZE);
    if(!Q->base){
        printf("空間不足,初始化失敗\n");
        return NULL;
    }
    Q->front=Q->rear=0;
    printf("初始化成功\n");
    return Q;
}

//銷燬
SqQueue *DestroyQueue(SqQueue* Q){
    free(Q->base);
    free(Q);
    printf("銷燬成功\n");
    return NULL;
}

//清空
void ClearQueue(SqQueue *Q){
    int i=Q->front;
    while(i%MAXSIZE != Q->rear){
        printf("%d被清空\n",Q->base[i%MAXSIZE]);
        Q->base[i%MAXSIZE] = 0;
        i++;
    }
    printf("清空成功\n");
}

//判空,1爲空
int QueueEmpty(SqQueue *Q){
    return(Q->rear == Q->front);
}

//返回隊列長度
int QueueLength(SqQueue *Q){
    return (Q->rear-Q->front+MAXSIZE)%MAXSIZE;
}

//獲取隊頭元素
QElemType GetHead(SqQueue *Q){
    if(Q->front != Q->rear){
        printf("隊頭元素是%d\n", Q->base[Q->front]);
        return Q->base[Q->front];
    }else{
        printf("空隊列,無隊頭\n");
    }
}

//插入新元素到隊尾,返回是否入隊成功的狀態
int EnQueue(SqQueue *Q, QElemType e){
    //斷定是否還有一個空
    if((Q->rear+1)%MAXSIZE == Q->front){
        printf("隊列已滿,%d元素入隊失敗\n",e);
        return 0;
    }
    Q->base[Q->rear] = e;
    //插入後尾指針加一
    Q->rear = (Q->rear+1)%MAXSIZE;
    printf("%d入隊成功\n", e);
    return 1;
}

//刪除隊頭元素
int DeQueue(SqQueue *Q, QElemType *e){
    //判空
    if(Q->front==Q->rear){
        printf("空隊列,刪除失敗\n");
        return 0;
    }
    *e = Q->base[Q->front];
    Q->front=(Q->front+1)%MAXSIZE;
    printf("%d元素出隊成功\n", *e);
    return 1;
}

//遍歷
void QueueTraverse(SqQueue *Q){
    if(QueueEmpty(Q)){
        printf("空隊列\n");
        return;
    }
    int i=Q->front;
    //只要不等於尾指針就一直遍歷
    while(i%MAXSIZE != Q->rear){
        printf("%d ",Q->base[i%MAXSIZE]);
        i++;
    }
    printf("\n");
}

int main(void)
{
    SqQueue *Q = NULL;
    QElemType e = NULL;
    //初始化測試
    Q = InitQueue(Q);

    //遍歷測試
    QueueTraverse(Q);

//    //入隊測試
//    EnQueue(Q, 1);
//    EnQueue(Q, 2);
//    EnQueue(Q, 3);
//    EnQueue(Q, 4);
//    QueueTraverse(Q);

//    //長度測試
//    printf("隊列長度爲%d\n",QueueLength(Q));
//    EnQueue(Q, 1);
//    EnQueue(Q, 2);
//    EnQueue(Q, 3);
//    EnQueue(Q, 4);
//    printf("隊列長度爲%d\n",QueueLength(Q));
//    EnQueue(Q, 5);
//    EnQueue(Q, 6);
//    printf("隊列長度爲%d\n",QueueLength(Q));

//    //出隊測試
//    DeQueue(Q, &e);
//    printf("測試e是否改變:%d\n",e);
//    QueueTraverse(Q);

//    //獲取隊頭元素測試
//    e = GetHead(Q);
//    EnQueue(Q, 999);
//    e = GetHead(Q);

//    //出入測試
//    EnQueue(Q, 1);
//    EnQueue(Q, 3);
//    EnQueue(Q, 5);
//    EnQueue(Q, 7);
//    EnQueue(Q, 9);
//    EnQueue(Q, 11);
//    QueueTraverse(Q);
//    DeQueue(Q, &e);
//    DeQueue(Q, &e);
//    DeQueue(Q, &e);
//    QueueTraverse(Q);
//    EnQueue(Q, 7);
//    EnQueue(Q, 9);
//    EnQueue(Q, 11);
//    EnQueue(Q, 13);
//    QueueTraverse(Q);

//    //清空測試
//    EnQueue(Q, 7);
//    EnQueue(Q, 9);
//    EnQueue(Q, 11);
//    EnQueue(Q, 13);
//    ClearQueue(Q);
//    QueueTraverse(Q);

    //銷燬測試
    EnQueue(Q, 7);
    EnQueue(Q, 9);
    EnQueue(Q, 11);
    EnQueue(Q, 13);
    Q = DestroyQueue(Q);
    QueueTraverse(Q);



    return 0;
}
相關文章
相關標籤/搜索