• 纯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
    本博客文章大多为原创,转载请请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Connection with Web.config
    sp_user_no(參數數的oracle_sp)及fn_test(有返回值的oracle參數)
    xml學習心得
    OOP 术语:Attributes(特性)与 Properties(属性)的区别(转载)
    asp.net 4.0 新特性(转载)
    详解C#中Attribute特性应用 (转载)
    保存web.config文件(转载)
    OOP 术语:Arguments(参量)和 Parameters(参数)的区别(转载)
    HTTP调试工具:Fiddler,httpwatch 介绍(转)
    C# 4.0新特性dynamic有何用处?(转载)
  • 原文地址:https://www.cnblogs.com/powerzzjcode/p/10889119.html
Copyright © 2020-2023  润新知