您的位置:首页 > 理论基础 > 数据结构算法

数据结构第七周项目4--队列数组

2017-12-14 10:25 246 查看
/* 

*Copyright(c)2017,烟台大学计算机与控制工程学院 

*All rights reserved. 

*作    者:刘浩

*版 本 号:v1.0 

问题描述:创建10个队列,分别编号为0-9(处理为队列数组,编号即下标)。 

          输入若干个正整数,以数字0作为结束。 

          设输入的值为x,其个位数字的大小为i,则将x插入到编号为i的队列中。 

          最后输出所有的非空队列。  

          要求将队列处理成链式队列,使用链式队列算法库中定义的数据类型及算法, 

          程序中只包括一个函数(main函数),入队和出队等操作直接在main函数中调用即可。 

*/  

头文件.h:

[cpp] view
plain copy

#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  

源文件.cpp:

[cpp] view
plain copy

#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;  

}  

main函数:

[cpp] view
plain copy

#include <stdio.h>  

  

#include <malloc.h>  

  

#include "liqueue.h"  

  

#define N 10  

  

  

  

int main()  

  

{  

  

   int i, a;  

  

   LiQueue *qu
; //定义队列指针数组  

  

   for (i=0; i<N; i++)  

  

       InitQueue(qu[i]);       //初始化队列  

  

  

  

   //为队列中加入值  

  

   printf("输入若干正整数,以0结束: ");  

  

   scanf("%d", &a);  

  

   while(a)  

  

   {  

  

       enQueue(qu[a%10], a);  

  

       scanf("%d", &a);  

  

   }  

  

  

  

   //输出各个队列  

  

   printf("按个位数整理到各个队列中后,各队列出队的结果是: \n");  

  

   for (i=0; i<N; i++)  

  

   {  

  

       printf("qu[%d]: ", i);  

  

       while(!QueueEmpty(qu[i]))  

  

       {  

  

           deQueue(qu[i], a);  

  

           printf("%d ", a);  

  

       }  

  

       printf("\n");  

  

   }  

  

  

  

   //销毁各个队列  

  

   for (i=0; i<N; i++)  

  

       DestroyQueue(qu[i]);  

  

   return 0;  

  

}  

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: