数据结构(链式队列)

链式存储的队列:链式队列

链式队列的组织形式与链表无异,只不过插入删除被约束在固定的两端。为了便于操作,通常也会 创建所谓管理结构体,用来存储队头指针、队尾指针、队列元素个数等信息:
在这里插入图片描述

从上图可以看到,链式队列主要控制队头和队尾,由于管理结构体中保存了当前队列元素个数 size,因此可以不必设计链表的头节点,初始化空队列时只需要让队头队尾指针同时指向空即可。 以下是队列链表节点设计和管理结构体设计的示例代码:

 typedef  int  DATA;
  // 链式队列节点
typedef struct _node
 {
   
    DATA        data;
    struct _node  *next;
 }NODE/*,*PNODE*/;
 // 链式队列管理结构体
typedef struct
 {
   
   NODE     *pHead; // 队头指针
   NODE     *pTail; // 队尾指针
   int       size ; // 队列当前元素个数
   int       num ;
 }LinkQueue;
  • 链式队列的基本操作

分析

在这里插入图片描述

linkQueue.h

#ifndef  __LINKQUEUE_H
 #define  __LINKQUEUE_H
 typedef  int  DATA;
 // 链式队列节点
typedef struct _node
 {
   
    DATA        data;
    struct _node  *next;
 }NODE/*,*PNODE*/;
 // 链式队列管理结构体
typedef struct
 {
   
   NODE     *pHead; // 队头指针
   NODE     *pTail; // 队尾指针
   int       size ; // 队列当前元素个数
      int       num ;
 }LinkQueue;
 void LQ_init(LinkQueue *q,int sz);
 int  LQ_isfull(LinkQueue *q);
 int  LQ_isempty(LinkQueue *q);
 int  LQ_push(LinkQueue *q,DATA data);
 int  LQ_pop(LinkQueue *q,DATA *data);
 int LQ_free(LinkQueue *q);
 #endif

这段代码是一个链式队列的实现,其中定义了两个结构体,一个是节点结构体NODE,包含了数据和指向下一个节点的指针;另一个是队列管理结构体LinkQueue,包含了队头指针、队尾指针、队列当前元素个数和编号。

以下是对各个函数的解析:

LQ_init:初始化队列,将队头指针和队尾指针初始化为NULL,元素个数初始化为0,编号初始化为sz。
LQ_isfull:判断队列是否已满,如果队列当前元素个数等于编号,则队列已满,返回1;否则返回0。
LQ_isempty:判断队列是否为空,如果队头指针和队尾指针都为NULL,表示队列为空,返回1;否则返回0。
LQ_push:入队操作,将数据data插入到队尾,如果队列已满,返回0;否则返回1。
LQ_pop:出队操作,将队头的数据保存到data中,并删除队头节点,如果队列已空,返回0;否则返回1。
LQ_free:释放队列的空间,将所有节点依次删除。
整个代码通过上述函数对链式队列进行了初始化、判断队列是否为空或已满、入队、出队和释放空间的操作。

linkQueue.c

 #include "LinkQueue.h"
 #include <stdlib.h>
 void LQ_init(LinkQueue *q,int sz)
 {
   
    q -> pHead = q -> pTail = NULL;
    q -> size  = sz;
    q -> num   = 0;
 }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值