队列—链式结构

1、定义

队列的链式存储结构,实质就是线性表的单链表,只是限定尾部进头部出的规则。

2、结构

如图所示
1)队列非空时,将头指针(front)指向头结点,尾指针指(rear)向队列的最后一个节点。
在这里插入图片描述
2)队列为空时,头指针(front)和尾指针指(rear)都指向头结点。
在这里插入图片描述
3、代码

queue.h

#ifndef Queue_H
#define Queue_H

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

typedef int Status;
typedef int DataType;

//节点的结构体定义
typedef struct Node{
    DataType data;
    struct node *next;
}Node;

//头指针、尾指针的结构体定义
typedef struct {
    Node *front;
    Node *rear;
}LinkQueue;

int GetQueueLength(LinkQueue *Lqueue);                    //获取链队的长度
Status DestroyQueue(LinkQueue *Lqueue);                   //销毁链队
Status IfQueueIsEmpty(LinkQueue *Lqueue);                 //判断链队是否为空
Status InitiateQueue(LinkQueue *Lqueue);                  //初始化链队
Status EnterQueueData(LinkQueue *Lqueue, DataType elem);  //入队
Status OutQueueData(LinkQueue *Lqueue, DataType *elem);   //出队
Status GetQueueElement(LinkQueue *Lqueue, DataType *elem);//取队头元素

#endif // MAINWINDOW_H

queue.c

#include "queue.h"

//初始化链队
Status InitiateQueue(LinkQueue *Lqueue)
{
    Node *head = (Node *)malloc(sizeof(Node));
    head->next = NULL;

    Lqueue->front = head;
    Lqueue->rear = head;

    return TRUE;
}

//判断链队是否为空
Status IfQueueIsEmpty(LinkQueue *Lqueue)
{
    if (Lqueue->front == Lqueue->rear)
    {
        printf("链队为空!\n");
        return FALSE;
    }
    else
        return TRUE;
}

//获取链队的长度
int GetQueueLength(LinkQueue *Lqueue)
{
    int length = 0;

    Node *p = Lqueue->front;
    while (p->next != NULL)
    {
        ++length;
        p = p->next;
    }
    return length;
}

//入队
Status EnterQueueData(LinkQueue *Lqueue, DataType elem)
{
    Node *p = (Node *)malloc(sizeof(Node));
    p->data = elem;
    p->next = NULL;

    Lqueue->rear->next = p;
    Lqueue->rear = p;
    return TRUE;
}

//出队
Status OutQueueData(LinkQueue *Lqueue, DataType *elem)
{
    if (Lqueue->front == Lqueue->rear) //链队为空的判断
    {
        printf("链队已空!\n");
        return FALSE;
    }

    Node *p = NULL;
    p = Lqueue->front->next;
    *elem = p->data;
    Lqueue->front->next = p->next;

    if (Lqueue->rear == p)
        Lqueue->rear = Lqueue->front;

    free(p);
    return TRUE;
}

//取队头元素
Status GetQueueElement(LinkQueue *Lqueue, DataType *elem)
{
    if (Lqueue->front == NULL)
    {
        printf("链队已空无数据元素可取! \n");
        return FALSE;
    }
    else
    {
        *elem = Lqueue->front->next->data;
        return TRUE;
    }
}

//销毁链队
Status DestroyQueue(LinkQueue *Lqueue)
{
    Node *p = NULL;

    while (Lqueue->front != Lqueue->rear)
    {
        p = Lqueue->front;
        Lqueue->front = p->next;
        free(p);
    }

    return TRUE;
}

main.c

#include "queue.h"

int main()
{
    LinkQueue Lqueue;
    int x = 0;

    InitiateQueue(&Lqueue);

    for(int i = 0; i < 10; i++)
    {
        EnterQueueData(&Lqueue, i+1);
    }

    GetQueueElement(&Lqueue, &x);
    printf("当前队头元素为:%d\n", x);

    printf("依次出队列的元素序列如下:\n");
    while(IfQueueIsEmpty(&Lqueue))
    {
        OutQueueData(&Lqueue, &x);
        printf("%d  ", x);
    }

    DestroyQueue(&Lqueue);
    IfQueueIsEmpty(&Lqueue);

    return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值