您的位置:首页 > 其它

第七周--项目4队列数组

2016-10-14 10:12 155 查看
*Copyright(c)2016,烟台大学计算机与控制工程学院  

 *All right reserved.  

 *文件名称:队列数组.cpp  

 *作者:陈晓琳 

 *完成日期;2016年10月14日  

 *版本号;v1.0  

 *  

 *问题描述: 创建10个队列,分别编号为0-9(处理为队列数组,编号即下标)。输入若干个正整数,以数字0作为结束。设输入的值为x,其个位数字的大小为i,则将x插入到编号为i的队列中。最后输出所有的非空队列。   

  要求将队列处理成链式队列,使用链式队列算法库中定义的数据类型及算法,程序中只包括一个函数(main函数),入队和出队等操作直接在main函数中调用即可。   

  设程序运行时输入:70 59 90 72 67 88 80 64 29 97 18 83 40 13 0   

  输出结果如下图:   

  qu[0]:70 90 80 40  

    qu[1]:   

    qu[2]:72  

    ......  

  

提示:   

- 指向单个链队的指针如下定义:   

 LiQueue *qu;   

- 本项目中使用的队列数组,实际上需要将十个链队的指针,顺序存储到一个数组中即可,如下定义:   

LiQueue *qu[10]; //qu是数组,数组中存储指针,存储的是指向LiQueue类型的指针  

  

  

  

 *输入描述:一列数字 *程序输出:整理后的数字排列*/  

  

  

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

}  

  

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

}  

  

#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  

运行结果:



知识点总结:

程序中采用顺序结构,队列数组中储存十个指向链队的指针。还要注意按位数分类时的求余,求得个位数再一一比较入队。

学习心得:

多尝试,遇到困难不能轻言放弃
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: