【数据结构】8. 队列(带头节点的单链表实现)(完整代码实现:初始化、入队列、出队列、获取队头元素、获取队尾元素、获取队列中有效元素的个数、判空、销毁)

本文详细介绍了使用带头节点的单链表实现队列的数据结构,涵盖了队列的初始化、入队、出队、获取队头/队尾元素、队列大小判断以及队列空检测等操作。通过示例代码展示了如何在C语言中实现这些功能,并提供了一个简单的测试用例。
摘要由CSDN通过智能技术生成

Queue.h

#pragma once 

//采用带头节点的单链表实现队列


typedef int DataType;

typedef struct QueueNode
{   
    struct QueueNode* next;
    DataType data;
}QNode;


typedef struct Queue
{
    QNode* front;
    QNode* back;
}Queue;

//初始化
void QueueInit(Queue* q);

//入队列
void QueuePush(Queue* q, DataType data);

//出队列
void QueuePop(Queue* q);

//获取队头元素
DataType QueueFront(Queue* q);

//获取队尾元素
DataType QueueBack(Queue* q);
    
//获取队列中有效元素的个数
int QueueSize(Queue* q);

//检测队伍中是否为空
int QueueEmpty(Queue* q);

//销毁
void QueueDestroy(Queue* q);

Queue.c

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

#include "Queue.h"

QNode* NewQueueNode(DataType data)
{
    QNode* node = (QNode*)malloc(sizeof(QNode));
    if(NULL == node)
    {
        assert(0);
        return NULL;
    }

    node->data = data;
    node->next = NULL;

    return node;
}

//初始化
void QueueInit(Queue* q)
{
    assert(q);

    q->front = q->back = NewQueueNode(0); //创建头节点
}

//入队列
void QueuePush(Queue* q, DataType data)
{
    assert(q);

    q->back->next = NewQueueNode(data); //将新数挂到最后面
    q->back = q->back->next; //将新数的节点变为最后一个节点
}

//出队列
void QueuePop(Queue* q)
{
    assert(q);

    //需要判空
    if(QueueEmpty(q))
        return;

    QNode* delNode = q->front->next;
    q->front->next = delNode->next; //让下下个节点成为头节点的下一个节点(让头节点指向下下个节点)

    //队列中只有一个元素,将该元素删除之后,需要让back节点指向头节点的位置
    if(NULL == delNode->next)
        q->back = q->front;

    free(delNode);
}

//获取队头元素
DataType QueueFront(Queue* q)
{
    assert(q);

    return q->front->next->data;
}

//获取队尾元素
DataType QueueBack(Queue* q)
{
    assert(q);

    return q->back->data;
}

//获取队列中有效元素的个数
int QueueSize(Queue* q)
{
    assert(q);

    //就是节点的个数(不包括头节点)
    int count = 0;
    QNode* cur = q->front->next;
    while(cur)
    {
        ++count;
        cur = cur->next;
    }
    return count;
}

//检测队列是否为空
int QueueEmpty(Queue* q)
{
    assert(q);

    return NULL == q->front->next;
}

//销毁队列  逐个删除节点
void QueueDestroy(Queue* q)
{
    assert(q);

    QNode* cur = q->front;
    while(cur)
    {
        q->front = cur->next;
        free(cur);
        cur = cur->next;
    }

    q->front = q->back = NULL;
}

test.c

#include <stdio.h>

#include "Queue.h"

int main()
{
    Queue q;
    QueueInit(&q);

    QueuePush(&q,1);
    printf("%d\n",QueueSize(&q));
    printf("%d\n",QueueFront(&q));
    printf("%d\n",QueueBack(&q));

    QueuePush(&q,1);
    QueuePush(&q,2);
    QueuePush(&q,3);
    QueuePush(&q,4);
    printf("%d\n",QueueSize(&q));
    printf("%d\n",QueueFront(&q));
    printf("%d\n",QueueBack(&q));

    QueuePop(&q);
    QueuePop(&q);
    printf("%d\n",QueueSize(&q));
    printf("%d\n",QueueFront(&q));
    printf("%d\n",QueueBack(&q));
    
    if(QueueEmpty(&q))
        printf("NULL\n");
    else 
        printf("error\n");

    QueuePop(&q);
    QueuePop(&q);
    QueuePop(&q);
    if(QueueEmpty(&q))
        printf("NULL\n");
    else 
        printf("error\n");

    //QueueDestroy(&q);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值