第七周项目4-队列数组(1)

  1. /* 
  2. *Copyright(c)2017,烟台大学计算机学院 
  3. *All right reserved. 
  4. *文件名:sk.cpp sqqueue.h sqqueue.cpp 
  5. *作者:盛凯 
  6. *完成日期:2017年10月25日 
  7. *版本号:v1.0 
  8. * 
  9. *问题描述:队列数组 
  10. *输入描述:整数组 
  11. *程序输出:见运行结果 
  12. */  
  13. sk.cpp:
  14. #include <stdio.h>
    #include <malloc.h>
    #include "liqueue.h"
    #define N 10


    int main()
    {
    int i,a=1,d,w=0,g,d1,e;
    LiQueue *q[N];

    for (i=0; i<N; i++)
    InitQueue(q[i]);

    while(a)
    {
    scanf("%d",&d);
    //d1=d;
    if(d==0)
    a=0;
    else
    {

    /*while(d!=0)
    {
    d=d/10;
    w++;
    }

    if(w<2)
    g=d1;
    else
    {
    for(i=0;i<w-1;i++)
    g=d1%10;
    }
    */
    switch(d%10)
    {
    case 0:   
    enQueue(q[0],d);
    break;
    case 1:   
    enQueue(q[1],d);
    break;
    case 2:
    enQueue(q[2],d);
    break;
    case 3:
    enQueue(q[3],d);
    break;
    case 4:
    enQueue(q[4],d);
    break;
    case 5: 
    enQueue(q[5],d);
    break;
    case 6:
    enQueue(q[6],d);
    break;
    case 7:
    enQueue(q[7],d);
    break;
    case 8:
    enQueue(q[8],d);
    break;
    case 9:   
    enQueue(q[9],d);
    break;
    }
    }
    }

    for(i=0;i<10;i++)
    {
    while(!QueueEmpty(q[i]))
    {

    deQueue(q[i],e);
    printf("%d ",e);
    }
    printf("\n");
    }
    return 0;
    }
  15. liqueue.cpp:
  16. #include <stdio.h>
    #include <malloc.h>
    #include "liqueue.h"


    void InitQueue(LiQueue *&q)  //初始化链队
    {
        q=(LiQueue *)malloc(sizeof(LiQueue));
        q->front=q->rear=NULL;
    }
    void DestroyQueue(LiQueue *&q)  //销毁链队
    {
        QNode *p=q->front,*r;   //p指向队头数据节点
        if (p!=NULL)            //释放数据节点占用空间
        {
            r=p->next;
            while (r!=NULL)
            {
                free(p);
                p=r;
                r=p->next;
            }
        }
        free(p);
        free(q);                //释放链队节点占用空间
    }
    bool QueueEmpty(LiQueue *q)  //判断链队是否为空
    {
        return(q->rear==NULL);
    }
    int QueueLength(LiQueue *q)  //返回队列中数据元素个数
    {
        int n=0;
        QNode *p=q->front;
        while (p!=NULL)
        {
            n++;
            p=p->next;
        }
        return(n);
    }
    void enQueue(LiQueue *&q,ElemType e)  //入队
    {
        QNode *p;
        p=(QNode *)malloc(sizeof(QNode));
        p->data=e;
        p->next=NULL;
        if (q->rear==NULL)      //若链队为空,则新节点是队首节点又是队尾节点
            q->front=q->rear=p;
        else
        {
            q->rear->next=p;    //将*p节点链到队尾,并将rear指向它
            q->rear=p;
        }
    }
    bool deQueue(LiQueue *&q,ElemType &e)   //出队
    {
        QNode *t;
        if (q->rear==NULL)      //队列为空
            return false;
        t=q->front;             //t指向第一个数据节点
        if (q->front==q->rear)  //队列中只有一个节点时
            q->front=q->rear=NULL;
        else                    //队列中有多个节点时
            q->front=q->front->next;
        e=t->data;
        free(t);
        return true;
    }
  17. liqueue.h:
  18. #ifndef LIQUEUE_H_INCLUDED
    #define LIQUEUE_H_INCLUDED


    typedef int ElemType;
    typedef struct qnode
    {
        ElemType data;
        struct qnode *next;
    } QNode;        //链队数据结点类型定义


    typedef struct
    {
        QNode *front;
        QNode *rear;
    } LiQueue;          //链队类型定义
    void InitQueue(LiQueue *&q);  //初始化链队
    void DestroyQueue(LiQueue *&q);  //销毁链队
    bool QueueEmpty(LiQueue *q);  //判断链队是否为空
    int QueueLength(LiQueue *q);  //返回队列中数据元素个数
    void enQueue(LiQueue *&q,ElemType e);  //入队
    bool deQueue(LiQueue *&q,ElemType &e);   //出队


    #endif // LIQUEUE_H_INCLUDED
  19. 程序运行结果如图所示:
  20. 第七周项目4-队列数组(1)
  21. 反思总结:
  22. 运用队列数组处理更加灵活方便,其中一些细节的地方还没有完全掌握,还需多加练习。