`

LinkQueue——链式队列

 
阅读更多

链式队列实现起来很简单。

唯一需要注意的是:

在入队和出队时,需要分别处理一下队头和队尾为空的情况。

/*
** File name: LinkQueue.h
** Author: ZhouFeng
** Date: 2012/03/28
*/
#ifndef LINK_QUEUE_H
#define LINK_QUEUE_H

#define BOOL int
#define FALSE 0
#define TRUE 1
#define ERROR 0
#define SUCCESS 1

typedef int EleType;
typedef struct LQNode
{
    EleType data;
    struct LQNode *pNext;
}LQNode;
typedef struct LinkQueue
{
    LQNode *pFront;
    LQNode *pRear;
}LinkQueue;

void InitLinkQueue(LinkQueue *LQ);
BOOL IsLinkQueueEmpty(LinkQueue *LQ);
int LinkQueueAppend(LinkQueue *LQ, EleType data);
int LinkQueueDelete(LinkQueue *LQ, EleType *pData);
int GetQueue(LinkQueue *LQ, EleType *pData);
void FreeQueue(LinkQueue *LQ);

#endif


/*
** File name: LinkQueue.c
** Author: ZhouFeng
** Date: 2012/03/28
*/
#include <stdlib.h>
#include <stddef.h>
#include "LinkQueue.h"

void InitLinkQueue(LinkQueue *LQ)
{
    if(LQ == NULL)
    {
	return;
    }

    LQ->pFront = NULL;
    LQ->pRear = NULL;
}

BOOL IsLinkQueueEmpty(LinkQueue *LQ)
{
    if(LQ == NULL)
    {
	return TRUE;
    }

    if(LQ->pFront == NULL)
    {
	return TRUE;
    }
    else
    {
	return FALSE;
    }
}

int LinkQueueAppend(LinkQueue *LQ, EleType data)
{
    LQNode *pNewNode;
    
    if(LQ == NULL)
    {
	return ERROR;
    }

    pNewNode = (LQNode*)malloc(sizeof(LQNode));
    pNewNode->data = data;
    pNewNode->pNext = NULL;
    
    if(LQ->pRear != NULL)
    {
	LQ->pRear->pNext = pNewNode;
    }
    LQ->pRear = pNewNode;

    if(LQ->pFront == NULL)
    {
	LQ->pFront = pNewNode;
    }

    return SUCCESS;
}

int LinkQueueDelete(LinkQueue *LQ, EleType *data)
{
    LQNode *pDel;
    
    if(LQ == NULL || data == NULL)
    {
	return ERROR;
    }

    if(LQ->pFront == NULL)
    {
	return ERROR;
    }

    *data = LQ->pFront->data;
    pDel = LQ->pFront;
    LQ->pFront = LQ->pFront->pNext;

    if(LQ->pFront == NULL)
    {
	LQ->pRear = NULL;
    }
    free(pDel);

    return SUCCESS;
}

int GetQueue(LinkQueue *LQ, EleType *pData)
{
    if(LQ == NULL || LQ->pFront == NULL || pData == NULL)
    {
	return ERROR;
    }

    *pData = LQ->pFront->data;

    return SUCCESS;
}

void FreeQueue(LinkQueue *LQ)
{
    LQNode *pDel;
    
    if(LQ == NULL)
    {
	return;
    }

    while(LQ->pFront != NULL)
    {
	pDel = LQ->pFront;
	LQ->pFront = LQ->pFront->pNext;
	free(pDel);
    }

    LQ->pRear = LQ->pFront = NULL;
}

分享到:
评论

相关推荐

    数据结构实验——队列(附程序).pdf

    首先,我们定义了一个结构体 LinkQueue 来表示链队列,包括队头指针 front 和队尾指针 rear。然后,我们实现了初始化队列、入链队列、出链队列、遍历链队列等基本运算。 例如,在 InitQueue 函数中,我们首先分配了...

    基本数据结构(2)队列

    我们将重点关注C++实现的两种队列类型:顺序队列(contqueue)和链式队列(linkqueue)。 首先,队列是一种先进先出(First In First Out, FIFO)的数据结构。新元素在队尾加入,而队头的元素是最早加入的元素,也...

    数据结构与算法——看病排队候诊问题.docx

    在解决看病排队候诊问题时,可以采用链式队列来实现两个不同的优先级别队列,q1 对应优先级别低的队列,q2 对应优先级别高的队列。 在解决看病排队候诊问题时,需要设计合适的数据结构和算法来模拟实际的医疗系统。...

    数据结构 堆栈和队列基本操作

    #### 四、示例代码分析——链式队列 下面是一段关于链式队列的基本操作的C语言示例代码: ```c #include #include #define NULL 0 // 定义队列元素类型 typedef int QElemType; // 定义队列结点结构体 typedef ...

    队列存储与操作

    通过本实验的学习,我们了解并掌握了队列的两种主要存储结构——循环队列和链式队列的设计与实现。这两种队列各有优势:循环队列利用固定大小的数组存储队列元素,适用于队列长度变化不大的情况;而链式队列则适合于...

    课程设计——寻找舞伴

    数据结构部分,定义了`QNode`结构体用于存储队列中的元素(即学生的编号),以及`LinkQueue`结构体表示链式队列,包括队头`front`和队尾`rear`指针。代码中定义了`girl`、`boy`和`music`三个循环队列,分别对应女生...

    数据结构与算法的实验报告.pdf

    对于链式队列,类似地定义结构体,如`LinkQueue`,并实现相应操作如`InitQueue`、`EnQueue`、`DeQueue`、`GetFront`、`QueueLength`、`EmptyQueue`和`DestroyQueue`。 此外,实验还要求学生对算法的效率进行评价。...

    循环队列学习解析以与C语言实现.docx

    #### 链式存储——链队列 链队列通过动态分配结点来存储队列元素,每个结点包含数据域和指向下一个结点的指针域。 **链队列的数据结构定义**: ```c typedef struct QNode { QElemType data; // 数据域 struct ...

    队列的动态链式存储实现代码分享

    /*————————————————————操作目的: 初始化队列初始条件: 无操作结果: 构造一个空的队列函数参数: LinkQueue *Q 待初始化的队列返回值: bool 操作是否成功————————————...

    NJUCM-数据结构课程3.实验三 栈和队列.zip

    LinkQueue 文件可能是一个实现了链式队列的源代码或者数据结构示例。链队列是队列的一种实现形式,它利用链表的特性,可以方便地在队尾插入元素,在队头删除元素,不受内存连续性限制。 SeqStack 文件则可能包含了...

    数据结构-停车场问题

    - **便道状态表示**:使用链式队列(`LinkQueue`)来表示便道,队首元素表示最先到达便道的车辆。 - **队列节点**:`QNode` 结构体,包含车辆编号 `car_num`、到达时间 `time` 及指向下一个节点的指针 `next`。 -...

    数字媒体技术221班孙汝航实验报告.doc

    2. **链式存储结构**:链式队列使用链表实现,每个元素(节点)包含一个数据域(`DataType info`)和一个指向下一个节点的指针(`struct LQNode *next`)。链表的头和尾由`LQNode *rear`和`LQNode *front`指针维护,...

    二叉树的几种重要算法

    链式队列节点`QNode`包含了存储二叉树节点的指针`Queuedata`和指向下一个节点的指针`next`。 在二叉树的创建和遍历中,栈和队列都有重要作用。例如,先序创建二叉树`PreOrderCreateBiTree`函数使用递归方式,通过...

    C语言层次遍历二叉树

    - `LinkQueue`: 链式队列,用于存储待访问的节点,由队头(`front`)和队尾(`rear`)指针组成。 - `InitQueue`: 初始化队列,创建队头和队尾指针,并设置队尾指针的下一个节点为`NULL`。 - `EnQueue`: 入队操作,将...

    数据结构实验-队列的相关计算

    ### 数据结构实验——队列的相关计算 #### 一、实验目的 本次实验旨在帮助学习者深入理解队列这一数据结构的基本概念与应用。通过实验,学生将能够掌握链队列的构建方法及其基本操作(如入队、出队等)。具体目标...

    实习报告-魔王语言解释.doc

    2. **队列类型**:采用链式队列结构`LinkQueue`,包含队首`front`和队尾`rear`指针。初始化`InitQueue()`、入队`EnQueue()`的实现确保了队列功能的完整。 在程序设计上,主要的`main()`函数负责整个流程的控制,...

    数据结构迷宫实验报告

    - **队列类型**:定义了链式队列`LinkQueue`,用于存储待访问的迷宫格子信息,支持入队和出队操作。 ### 基本操作的伪代码实现 - `InitQueue(LinkQueue *Q)`:创建一个空队列。 - `EnQueue(LinkQueue *Q, ...

    数据结构栈和队列实验报告C语言源码(程序在C-Free下通过) .docx

    本实验报告重点介绍了两种基本的数据结构——栈和队列,它们在编程中有着广泛的应用。实验使用C语言作为实现工具,并在C-Free环境下进行了验证。 栈是一种后进先出(LIFO)的数据结构,其操作主要集中在栈顶。实验...

Global site tag (gtag.js) - Google Analytics