数据结构之队列10单链队列定义及实现

本文介绍了队列的概念,强调其先进先出的特性,并重点讲解了单链队列的实现。通过C语言代码展示了如何初始化、销毁、清空队列,以及判断队列是否为空、获取队头元素、插入和删除元素等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



队列

队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。

队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。

单链队列

单链队列使用链表作为基本数据结果,所以不存在伪溢出的问题,队列长度也没有限制。但插入和读取的时间代价较高

#include <stdio.h>
#include <stdlib.h>
typedef int Status;
#define TRUE 1;
#define FALSE 0;
#define OK 1;
#define ERROR -1;
#define INFEASBIOLE -2;
#define OVERFLOW 0;
#define STACK_INT_SIZE 100
#define STACKINCREAMENRT 10
//单链队列————队列的链式存储结构
typedef struct QNode
{
    QElemtype data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr front,rear;
}LinkQueue;
//链队列的基本操作(9个)
Status InitQueue(LinkQueue *Q)
{
    //构造一个空队列
    Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
    if(!Q->front||!Q->rear)
        return OVERFLOW;
    Q->front=Q->rear=NULL;
    return OK;
}
Stauts DestroyQueue(LinkQueue *Q)
{
    //销毁队列Q
    while(Q->front)
    {
        Q->rear=Q->front->next;
        free(Q->front);
        Q->front=Q->rear;
    }
    return OK;
}
Status ClearQueue(LinkQueue *Q)
{
    //将Q清为空队列
    QueuePtr p,q;
    Q->rear=Q->front;
    p=Q->front->next;
    Q->front->next=NULL;
    while(p)
    {
        q=p->next;
        free(p);
        p=q;
    }
    return OK;
}
Status QueueEmpty(LinkQueue Q)
{
    //判断队列是否为空
    if(Q->front->next==NULL)
        return TRUE;
    return FALSE;
}
int QueueLength(LinkQueue Q)
{
    //求队列的长度
    int i=0;
    QueuePtr p;
    p=Q.front;
    while(Q.rear!=p)
    {
        i++;
        p=p->next;
    }
    return i;
}
Status GetHead(LinkQueue Q,QElemType *e)
{
    //返回队头元素
    if(Q->front==Q->rear)
        return ERROR;
    QueuePtr p;
    p=Q->front->next;
    *e=p.data;
    return OK;
}
Status EnQueue(LinkQueue *Q,QElenType e)
{
    //插入元素e为Q的新队尾元素
    QueuePtr p;
    p=(QueuePtr)malloc(sizeof(QNode));
    if(!p)
        return OVERFLOW;
    p->data=e;
    p->next=NULL;
    Q->rear->next=p;
    Q->rear=p;
    return OK;
}
Status DeQueue(LinkQueue *Q,QElmtype *e)
{
    //删除队头元素并返回
   if(Q->front==Q->rear)
    return ERROR;
   QueuePtr p;
   p=Q->front;
   *e=p->data;
   Q->front=p->next;
   if(Q->rear==p)
    Q->rear==Q->front;
   free(p);
   return OK;
}
Status QueueTraverse(LinkQueue Q,int(*vi)(QElemType))
{
    //遍历操作
    QueuePtr p;
    p=Q->rear->next;
    while(p)
    {
        vi(p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}
int main()
{
    printf("Hello world!\n");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值