动态链式队列

写的这篇和上一篇差不多,队列,早就已经写好了,就是没时间把代码敲过来,今天晚上睡觉前有点时间就写写吧,下面上代码

1.定义ElemType,方便更改类型(本程序采用ElemType 为int类型)

/***
*ElemType.h - ElemType的定义
*
****/

#ifndef ELEMTYPE_H
#define ELEMTYPE_H

typedef int ElemType;

int  compare(ElemType x, ElemType y);
void visit(ElemType e);

#endif /* ELEMTYPE_H */

2.定义动态链式队列和基本操作

/***
*DynaLnkQueue.h - 动态链式队列的定义
*   
****/

#if !defined(DYNALNKQUEUE_H)
#define DYNALNKQUEUE_H

#include "ElemType.h"

/*------------------------------------------------------------
// 链式队列结构的定义
------------------------------------------------------------*/

typedef struct Node
{
    ElemType data;              // 元素数据
    struct Node *next;          // 链式队列中结点元素的指针
} QNode, *QueuePtr;

typedef struct
{
    QueuePtr front;             // 队列头指针
    QueuePtr rear;              // 队列尾指针
} LinkQueue;

/*------------------------------------------------------------
// 链式队列的基本操作
------------------------------------------------------------*/

bool InitQueue(LinkQueue *Q);
void DestroyQueue(LinkQueue *Q);
bool QueueEmpty(LinkQueue Q);
int  QueueLength(LinkQueue Q);
bool GetHead(LinkQueue Q, ElemType *e);
void QueueTraverse(LinkQueue Q, void (*fp)(ElemType));
void ClearQueue(LinkQueue *Q);
bool EnQueue(LinkQueue *Q, ElemType e);
bool DeQueue(LinkQueue *Q, ElemType *e);

#endif /* DYNALNKQUEUE_H */

3.动态链式队列基本操作的实现

/***
*DynaLnkQueue.cpp - 动态链式队列,即队列的动态链式存储实现
*
*
*题目:实验3-2 队列的动态链式存储实现
*
*班级:
*
*姓名:
*
*学号:
*   
****/

#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#include "DynaLnkQueue.h"

/*------------------------------------------------------------
操作目的:   初始化队列
初始条件:   无
操作结果:   构造一个空的队列
函数参数:
        LinkQueue *Q    待初始化的队列
返回值:
        bool            操作是否成功
------------------------------------------------------------*/
bool InitQueue(LinkQueue *Q)
{
    Q -> front = Q -> rear = (QueuePtr)malloc(sizeof(QNode));
    if(!Q -> front)
        return false;
    Q -> front -> next = NULL;
    return true;
}

/*------------------------------------------------------------
操作目的:   销毁队列
初始条件:   队列Q已存在
操作结果:   销毁队列Q
函数参数:
        LinkQueue *Q    待销毁的队列
返回值:
        无
------------------------------------------------------------*/
void DestroyQueue(LinkQueue *Q)
{
    while(Q -> front)
    {
        Q -> rear = Q -> front -> next;
        free(Q -> front);
        Q -> front = Q -> rear;
    }
}

/*------------------------------------------------------------
操作目的:   判断队列是否为空
初始条件:   队列Q已存在
操作结果:   若Q为空队列,则返回true,否则返回false
函数参数:
        LinkQueue Q     待判断的队列
返回值:
        bool            是否为空
------------------------------------------------------------*/
bool QueueEmpty(LinkQueue Q)
{
    if(Q.front == Q.rear)
    {
        return true;
    }
    return false;
}

/*------------------------------------------------------------
操作目的:   得到队列的长度
初始条件:   队列Q已存在
操作结果:   返回Q中数据元素的个数
函数参数:
        LinkQueue Q     队列Q
返回值:
        int             数据元素的个数
------------------------------------------------------------*/
int QueueLength(LinkQueue Q)
{
    int i = 0;
    QueuePtr p = Q.front;
    while(p != Q.rear)
    {
        p = p -> next;
        i++;
    }
    return i;
}

/*------------------------------------------------------------
操作目的:   得到队列首元素
初始条件:   队列Q已存在
操作结果:   用e返回队列首元素
函数参数:
        LinkQueue Q     队列Q
        ElemType *e     队列首元素的值
返回值:
        bool            操作是否成功
------------------------------------------------------------*/
bool GetHead(LinkQueue Q, ElemType *e)
{
    if(Q.front == Q.rear)
        return false;
    *e = Q.front -> next -> data;
    return true;
}

/*------------------------------------------------------------
操作目的:   遍历队列
初始条件:   队列Q已存在
操作结果:   依次对Q的每个元素调用函数fp
函数参数:
        LinkQueue Q     队列Q
        void (*fp)()    访问每个数据元素的函数指针
返回值:
        无
------------------------------------------------------------*/
void QueueTraverse(LinkQueue Q, void (*fp)(ElemType))
{
    QueuePtr p = Q.front -> next;
    while(p)
    {
        fp(p -> data);
        p = p -> next;
    }
}

/*------------------------------------------------------------
操作目的:   清空队列
初始条件:   队列Q已存在
操作结果:   将队列清空
函数参数:
        LinkQueue *Q    队列Q
返回值:
        无
------------------------------------------------------------*/
void ClearQueue(LinkQueue *Q)
{
    QueuePtr p,q;   
    p = Q -> front ->next;
    Q -> front -> next =NULL;
    while(p != Q -> rear)
    {
        q = p;
        p = p -> next;
        free(q);
    }
    Q -> rear = Q -> front;  //当结尾Q -> rear 为指向首节点时会出错,,,原因?
}

/*------------------------------------------------------------
操作目的:   在队列末尾插入元素e
初始条件:   队列Q已存在
操作结果:   插入元素e作为队列新的尾结点
函数参数:
        LinkQueue *Q        队列Q
        ElemType e      待插入的数据元素
返回值:
        bool            操作是否成功
------------------------------------------------------------*/
bool EnQueue(LinkQueue *Q, ElemType e)
{
    QueuePtr p = (QNode *)malloc(sizeof(QNode));
    if(!p)
        return false;
    p -> data = e;
    p -> next = Q -> rear;
    Q -> rear -> next= p;
    Q -> rear = p;
    return true;
}

/*------------------------------------------------------------
操作目的:   删除链式队列的头结点
初始条件:   队列Q已存在
操作结果:   删除链式队列的头结点
函数参数:
        LinkQueue *Q        队列Q
        ElemType *e     待插入的数据元素
返回值:
        bool            操作是否成功
------------------------------------------------------------*/
bool DeQueue(LinkQueue *Q, ElemType *e)
{
    QueuePtr p = Q -> front -> next;
    if(Q -> front == Q -> rear)
        return false;
    Q -> front -> next = p -> next;
    *e = p -> data;
    if(Q -> rear == p)
        Q -> rear = Q  -> front;
    free(p);
    return true;
}

4.主函数(程序入口点,可以自定义,想怎么玩就怎么玩,玩坏了自己负责O(∩_∩)O哈哈~)
下面是我瞎玩的,已被玩坏,千!万!不!要!用!

#include <stdio.h>
#include "DynaLnkQueue.h"

int main()
{
    // TODO: Place your test code here
    LinkQueue a;
    int b;
    printf("链式队列初始化:  %d\n\n",InitQueue(&a));
    printf("链式队列是否为空:  %d\n\n",QueueEmpty(a));
    EnQueue(&a,12);
    for(int i = 3; i < 22;i++)
    {
        b = EnQueue(&a,i);
    }
    printf("链式队列插入20个数据:  %d\n\n",b);
    printf("链式队列是否为空:  %d\n\n",QueueEmpty(a));
    printf("链式队列长度:  %d\n\n",QueueLength(a));
    GetHead(a,&b);
    printf("链式队列获得首元素:  %d\n\n",b);
    printf("链式队列删除队头元素:  %d\n\n",DeQueue(&a,&b));

    GetHead(a,&b);
    printf("链式队列获得首元素:  %d\n\n",b);
    ClearQueue(&a);
    printf("链式队列清空后长度:  %d\n\n",QueueLength(a));

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值