纯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("空间不足,初始化失败
");
        return NULL;
    }
    Q->front=Q->rear=0;
    printf("初始化成功
");
    return Q;
}

//销毁
SqQueue *DestroyQueue(SqQueue* Q){
    free(Q->base);
    free(Q);
    printf("销毁成功
");
    return NULL;
}

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

//判空,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
", Q->base[Q->front]);
        return Q->base[Q->front];
    }else{
        printf("空队列,无队头
");
    }
}

//插入新元素到队尾,返回是否入队成功的状态
int EnQueue(SqQueue *Q, QElemType e){
    //判定是否还有一个空
    if((Q->rear+1)%MAXSIZE == Q->front){
        printf("队列已满,%d元素入队失败
",e);
        return 0;
    }
    Q->base[Q->rear] = e;
    //插入后尾指针加一
    Q->rear = (Q->rear+1)%MAXSIZE;
    printf("%d入队成功
", e);
    return 1;
}

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

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

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
",QueueLength(Q));
//    EnQueue(Q, 1);
//    EnQueue(Q, 2);
//    EnQueue(Q, 3);
//    EnQueue(Q, 4);
//    printf("队列长度为%d
",QueueLength(Q));
//    EnQueue(Q, 5);
//    EnQueue(Q, 6);
//    printf("队列长度为%d
",QueueLength(Q));

//    //出队测试
//    DeQueue(Q, &e);
//    printf("测试e是否改变:%d
",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;
}
作者:PowerZZJ
本博客文章大多为原创,转载请请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/powerzzjcode/p/10889119.html