链式存储的队列:链式队列
链式队列的组织形式与链表无异,只不过插入删除被约束在固定的两端。为了便于操作,通常也会 创建所谓管理结构体,用来存储队头指针、队尾指针、队列元素个数等信息:
从上图可以看到,链式队列主要控制队头和队尾,由于管理结构体中保存了当前队列元素个数 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;
}