数据结构与算法之线性表(五):链式队列的实现和应用

系列文章传送门:

数据结构与算法之树和二叉树(一):二叉树基本操作的实现及应用
数据结构与算法之线性表(二):链式表的实现和应用
数据结构与算法之线性表(三):顺序栈的实现和应用
数据结构与算法之线性表(四):链式栈的实现和应用
数据结构与算法之线性表(五):链式队列的实现和应用
数据结构与算法之线性表(六):顺序队列及循环队列的实现和应用

一.链式队列基本操作实现(所有代码均在Embarcadero DevC++6.0和VSCode 2021上编译运行通过)

#include<stdio.h>
#include<stdlib.h>
#define QElemType int
#define Status int
#define OVERFLOW        -1
#define OK               1
#define ERROR            0
#define TRUE             1
#define FALSE            0
typedef struct QNode
{
    QElemType data; //定义队列结点
    struct QNode *next;
}QNode, *QueuePtr;

typedef struct      //定义队首和队尾指针
{
    QueuePtr front;     //头尾指针
    QueuePtr rear;
}LinkQueue;

Status InitQueue(LinkQueue &Q)
{
    Q.front = (QueuePtr)malloc(sizeof(QNode));  //为首尾指针申请空间
    Q.rear = (QueuePtr)malloc(sizeof(QNode));
    Q.front->next=NULL;             
	Q.rear = Q.front;
    return OK;
}   
Status GetHead(LinkQueue Q, QElemType &e)
{
    e = Q.front->next->data;
    return OK;
}
Status QueueEmpty(LinkQueue Q)
{   
    if(Q.front==Q.rear)
        return OK;
    else 
        return FALSE;  
}
Status EnQueue(LinkQueue &Q, QElemType e) 
{
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if(!p)
        exit(OVERFLOW);
    Q.rear->next = p;
    p->data = e;
    Q.rear = p;     //尾部指针后移
    p->next = NULL;
    return OK;
}
Status DeQueue(LinkQueue &Q, QElemType &e)
{
    if(Q.front==Q.rear)//若队列为空,出队失败
        return ERROR;
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if(Q.front->next==Q.rear)//若删除的元素是队尾元素
    {
    	p = Q.front->next;
        e = p->data ;       //e来接盘
        Q.rear = Q.front;   //队首队尾指针都指向头结点
        free(p);
    }
    else
    {
    	p = Q.front->next;
    	Q.front->next = p->next;
        e = p->data ;       //e来接盘
        free(p);
    }
    return OK;
}
Status QueueLength(LinkQueue Q) 
{
    int count;
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    p = Q.front->next;
    while (p)
    {
        count++;
        p = p->next;
    }
    return OK;
}
Status ClearQueue(LinkQueue &Q)
{
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if(!p)
        exit(OVERFLOW);
    while (Q.front->next)
    {
        p = Q.front->next;
        Q.front = p->next;
        free(p);
    }
    Q.rear = Q.front;
    return OK;
}
//              QueueTraverse(Q, Visit()); 
Status DestroyQueue(LinkQueue &Q)
{
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if(!p)
        exit(OVERFLOW);
    while (Q.front->next)
    {
        p = Q.front->next;
        Q.front = p->next;
        free(p);
    }
    free(Q.front);
    free(Q.rear);
    return OK;
}
Status QueueTraverse(LinkQueue Q, Status (*Visit)(QElemType))
{
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if(!p)
        exit(OVERFLOW);
    p = Q.front->next;
    while (p)
    {
        if(!Visit(p->data))
            return ERROR;
        p = p->next;    
    }
    return OK;    
}
Status print(QElemType e)
{
    printf("%d->",e);
    return OK;
}
int main()
{
    QElemType e;
    LinkQueue Q;
    InitQueue(Q);
    for (int i = 1; i <= 10; i++)
    {
        EnQueue(Q,i);
    }
    DeQueue(Q,e);
    QueueTraverse(Q,print); 
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值