C语言-队列queue顺序存储和链式存储

本文深入讲解了队列这种先进先出的线性表结构,包括队列的基本概念、队列的顺序存储和链式存储方式,以及队列的常用操作如创建、销毁、清空、入队、出队等。

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

理解队列

队列是一种特殊的先进先出的线性表,队列的操作只能在队头和队尾操作,即队尾插入数据,队头取数据。

                    

队列的顺序存储

队列的顺序存储类似线性表的顺序存储

//SeqQueue.h
#pragma once
typedef void SeqQueue;
//创建队列
SeqQueue* SeqQueue_Create(int capacity);
//销毁队列
void SeqQueue_Destroy(SeqQueue* queue);
//清空队列
void SeqQueue_Clear(SeqQueue* queue);
//入队
int SeqQueue_Append(SeqQueue* queue, void* item);
//出队
void* SeqQueue_Retrieve(SeqQueue* queue);
//获取队头元素
void* SeqQueue_Header(SeqQueue* queue);
//获取队列大小
int SeqQueue_Size(SeqQueue* queue);
//获取队列容量
int SeqQueue_Capacity(SeqQueue* queue);

队列的链式存储

同样在元素入队列时需要给结点分配内存空间,在出队列时需要释放结点的内存。

//LinkQueue.h
#pragma once
typedef void LinkQueue;
//创建链队
LinkQueue* LinkQeueu_Create();
//销毁链队
void LinkQeueu_Destroy(LinkQueue* queue);
//清空链队
void LinkQeueu_Clear(LinkQueue* queue);
//元素入队
int LinkQeueu_Append(LinkQueue* queue, void* item);
//元素出队
void* LinkQeueu_Retrieve(LinkQueue* queue);
//获取队头元素
void* LinkQeueu_Header(LinkQueue* queue);
//获取队列大小
int LinkQeueu_Size(LinkQueue* queue);
#pragma warning(disable : 4996)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "LinkQueue.h"
#include "LinkList.h"
//队列结点
typedef struct tag_LinkQeueuNode
{
    //队列结点包含链表结点
    TLinkListNode node;
    void* item;
}TLinkQueueNode;
//创建链队
LinkQueue* LinkQeueu_Create()
{
    return (LinkQueue *)LinkList_Creat();
}
//销毁链队
void LinkQeueu_Destroy(LinkQueue* queue)
{
    if (queue == NULL)
    {
        printf("LinkQeueu_Destroy err: queue = NULL");
        return;
    }
    LinkQeueu_Clear(queue);
    LinkList_Destroy(queue);
}
//清空链队
void LinkQeueu_Clear(LinkQueue* queue)
{
    if (queue == NULL)
    {
        printf("LinkQeueu_Clear err: queue = NULL");
        return;
    }
    while (LinkQeueu_Size(queue)>0)
    {
        LinkQeueu_Retrieve(queue);
    }
}
//入队列
int LinkQeueu_Append(LinkQueue* queue, void* item)
{
    TLinkQueueNode *temp = NULL;
    int ret = 0;
    if (queue == NULL || item == NULL)
    {
        ret = -1;
        printf("LinkQeueu_Append err: queue = NULL || item = NULL");
        return ret;
    }
    temp = (TLinkQueueNode *)malloc(sizeof(TLinkQueueNode));//分配内存空间
    if (temp == NULL)
    {
        ret = -2;
        printf("LinkQeueu_Append TLinkQueueNode malloc err:%d\n", ret);
        return ret;
    }
    memset(temp, 0, sizeof(TLinkQueueNode));//结点初始化
    temp->item = item;//保存结点信息
    ret = LinkList_inster(queue, (TLinkListNode*)temp, 0);//入队列
    if (ret != 0)//异常处理
    {
        if (temp != NULL)
            free(temp);
    }
    return ret;
}
//出队列
void* LinkQeueu_Retrieve(LinkQueue* queue)
{
    TLinkQueueNode *temp = NULL;
    void *item = NULL;
    if (queue == NULL)
    {
        printf("LinkQeueu_Retrieve err: queue = NULL");
        return NULL;
    }
    temp = (TLinkQueueNode *)LinkList_Delete(queue, LinkList_GetLength(queue) - 1);//删除队尾元素
    if (temp != NULL)
    {
        item = temp->item;
        free(temp);//释放结点
    }
    return item;
}
//获取队头元素
void* LinkQeueu_Header(LinkQueue* queue)
{
    TLinkQueueNode *temp = NULL;
    void *item = NULL;
    if (queue == NULL)
    {
        printf("LinkQeueu_Header err: queue = NULL");
        return NULL;
    }
    temp = (TLinkQueueNode *)LinkList_Get(queue, LinkList_GetLength(queue) - 1);
    if (temp != NULL)
    {
        item = temp->item;
    }
    return item;
}
//获取链队大小
int LinkQeueu_Size(LinkQueue* queue)
{
    if (queue == NULL)
    {
        printf("LinkQeueu_Size err: queue = NULL");
        return -1;
    }
    return LinkList_GetLength(queue);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值