数据结构: 队列(链式存储)

本文详细介绍了链队列的数据结构设计与实现方法,包括队列的初始化、数据的插入与删除操作,以及如何统计队列中元素的数量。通过具体的代码示例,展示了链队列在动态内存管理方面的优势,特别适用于未知队列长度的情况。

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

https://blog.csdn.net/xy010902100449/article/details/46563643

 

数据结构和算法

https://blog.csdn.net/xy010902100449/article/category/5593677/2?

 

【摘要】前一篇博客主要讨论循环队列,但是循环队列都是事先申请好空间,使用期间是不能释放的。但是链队列,每次都可以进行申请和释放结点。再无法预估队列长度的时候,我们可以考虑用链队列。 
(1)设计队列数据结构

/*结点结构*/
typedef struct _QUEUE_NODE
{
    int pData;
    struct _QUEUE_NODE *next;
}QUEUE_NODE,*QUEUEPtr;

/*队列的链表结构*/
typedef struct LinkQueue
{
    QUEUEPtr head;
    QUEUEPtr tail;
    int count;
}LinkQueue;


(2) 初始化队列

STATUS init_queue(LinkQueue* pQueueNode)
{

    pQueueNode->head = (QueuePtr)malloc(sizeof(QUEUE_NODE)); // 生成头结点
    if(!pQueueNode->head) // 生成头结点失败
        return FALSE;

    pQueueNode->tail = pQueueNode->head;    
    pQueueNode->head->next=NULL; // 头结点的next域为空

    pQueueNode->count = 0;

    return TRUE;
}


(3) 把数据压入队列

STATUS insert_queue(LinkQueue* pQueueNode, int value)
{
    QUEUEPtr s = (QUEUEPtr)malloc(sizeof(QUEUE_NODE));

    if(NULL == s)
        return FALSE;

    s->data = value;
    s->next = NULL; 

    pQueueNode->tail->next = s;
    pQueueNode->tail = s;  //队尾指针位置
    pQueueNode->count ++;

    return TRUE;
}


(4)把数据弹出队列

STATUS get_queue_data(LinkQueue* pQueueNode, int* value)
{
    QUEUEPtr s = NULL;
    if(NULL == pQueueNode || NULL == value || pQueueNode->head == pQueueNode->tail)
        return FALSE;

    if(0 == pQueueNode->count)
        return FALSE;

    *value = pQueueNode->head; //返回值

    s = pQueueNode->head; //保存下来
    pQueueNode->head = s->next;//重新赋值头指针
    /*
    带头结点的队列
    s = pQueueNode->head->next; //保存下来
    pQueueNode->head = s->next;//重新赋值头指针

    if(pQueueNode->tail==s)  //队头就是队尾
    {
        pQueueNode->tail = pQueueNode->head
    }
    */

    free(s);
    s = NULL;

    pQueueNode-> count--;

    return TRUE;
}


(5)统计当前队列中有多少数据

int  get_total_number(const LinkQueue* pQueueNode)
{
    if(NULL == pQueueNode)
        return 0;

    return pQueueNode->count;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值