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

数据结构上机实践第七周项目2 - 自建算法库——链队(链式队列)

2017-12-25 08:21 393 查看



自建算法库——链队(链式队列)

实现源代码如下:

1.liqueue.h

[cpp] view
plain copy

  

    

要求:    

    1、头文件liqueue.h中定义数据结构并声明用于完成基本运算的函数。对应基本运算的函数包括:    

    void InitQueue(LiQueue *&q);  //初始化链队    

    void DestroyQueue(LiQueue *&q); //销毁链队    

    bool QueueEmpty(LiQueue *q);  //判断链队是否为空    

    int QueueLength(LiQueue *q);   //返回链队中元素个数,也称队列长度    

    bool enQueue(LiQueue *&q,ElemType e);   //进队    

    bool deQueue(LiQueue *&q,ElemType &e);  //出队    

  2、在liqueue.cpp中实现这些函数    

  3、在main函数中完成测试,包括如下内容:    

    (1)初始化队列q    

    (2)依次进队列元素a,b,c    

    (3)判断队列是否为空    

    (4)出队一个元素    

    (5)输出队列中元素个数    

    (6)依次进队列元素d,e,f    

    (7)输出队列中元素个数    

    (8)将队列中所有元素删除,并输出序列    

    (9)释放队列    

    

*输入描述:无    

    

*程序输出:完成测试后的运行结果    

    

*/      

typedef char 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);      //出队      

2.liqueue.cpp

[cpp] view
plain copy

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

    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)                 //返回链队中元素个数,也称队列长度      

{      

    QNode *p=q->front;      

    int length=0;                           //设计数变量,记录表长      

    while(p!=NULL)      

    {      

        length++;      

        p=p->next;      

    }      

    return length;      

}      

void enQueue(LiQueue *&q,ElemType e)        //进队      

{      

    QNode *p;      

    p=(QNode *)malloc(sizeof(QNode));      

    p->data=e;      

    p->next=NULL;                           //创建data域为e、指针域为NULL的数据节点*p      

    if(q->rear==NULL)      

        q->front=q->rear=p;      

    else      

    {      

        q->rear->next=p;      

        q->rear=p;      

    }      

}      

bool deQueue(LiQueue *&q,ElemType &e)       //出队 需考虑队列为空的情况,故设置函数类型为bool型      

{      

    QNode *t;      

    if(q->rear==NULL)      

        return false;      

    t=q->front;      

    if(q->front==q->rear)      

        q->front=q->rear=NULL;      

    else      

        q->front=q->front->next;      

    e=t->data;      

    free(t);      

    return true;      

}      

3.main.cpp

[cpp] view
plain copy

#include <stdio.h>      

#include <malloc.h>      

#include "liqueue.h"      

int main()      

{      

    LiQueue *q;      

    ElemType e;      

      

    InitQueue(q);                           //初始化队列q      

    printf("该队列已被初始化!\n");      

      

    if(QueueEmpty(q))                       //判断队列是否为空      

        printf("该队列为空\n");      

    else      

        printf("该队列不为空\n");      

      

    enQueue(q,'a');                         //依次进队列元素a,b,c      

    enQueue(q,'b');      

    enQueue(q,'c');      

      

    printf("元素a,b,c进队后,");      

    if(QueueEmpty(q))                       //判断队列是否为空      

        printf("该队列为空\n");      

    else      

        printf("该队列不为空\n");      

      

    if(deQueue(q,e)==0)                     //出队一个元素      

        printf("此队列已为空,出队操作失败!\n");      

    printf("出队成功,出队元素为%c\n",e);      

      

    printf("此时队列中元素个数为:%d\n",QueueLength(q));   //输出队列中元素个数      

      

    enQueue(q,'d');                         //依次进队列元素d,e,f      

    enQueue(q,'e');      

    enQueue(q,'f');      

      

    printf("元素d,e,f进队后,队列中元素个数为:%d\n",QueueLength(q));   //输出队列中元素个数      

      

    printf("出队序列为:");                 //将队列中所有元素删除,并输出序列      

    while(!QueueEmpty(q))      

    {      

        deQueue(q,e);      

        printf("%c",e);      

    }      

    printf("\n");      

      

    DestroyQueue(q);                        //释放队列      

    printf("该队列已释放!\n");      

      

    return 0;      

}      

运行结果截图如下:

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