数据结构:队列的链式存储结构

链队列的实现方法:



队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,简称为链队列。
为了操作上的方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点。空队列时,front和rear都指向头节点。

注意:这里的实现是有头结点的,在队列的初始化函数中要为头结点开辟空间。

链队列的实现代码:


#include <iostream>
#include <stdlib.h>
using namespace std;

/*******************************
*
*    链队列的结构实现
*
*******************************/
typedef int QElemType;
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode, *QNodePtr;

typedef struct
{
    QNodePtr front;
    QNodePtr rear;
}LinkQueue;

/*******************************
*
*    链队列的操作实现
*
*******************************/

/*初始化一个链队列*/
bool InitQueue(LinkQueue *lq)
{
    cout << "Init LinkQueue ..." << endl;

    QNodePtr p = (QNodePtr)malloc(sizeof(QNode));
    p->next = NULL;
    lq->front = lq->rear = p;

    return true;
}

/*插入元素e为Q的新的队尾元素*/
bool EnQueue(LinkQueue *lq, QElemType e)
{
    QNodePtr s = (QNodePtr)malloc(sizeof(QNode));
    if(!s)
    {
        exit(0);
    }
    s->data = e;
    s->next = NULL;

    lq->rear->next = s;
    lq->rear = s;

    return true;
}
/*删除队列的队头元素,用e返回其值*/
bool DeQueue(LinkQueue *lq, QElemType *e)
{
    QNodePtr p = NULL;

    if(lq->front == lq->rear)
    {
        return false;
    }
    p = lq->front->next;

    *e = p->data;

    lq->front->next = p->next;

    if(p == lq->rear)/*若队头同时又是队尾,则删除后将rear指向头结点*/
    {
        lq->rear = lq->front;
    }
    cout << "DeQueue Item: " << *e << endl;
    free(p);

    return true;
}
/*销毁队列,包括头结点*/
bool DestroyQueue(LinkQueue *lq)
{
    cout << "Destroy Queue... " << endl;
    while(lq->front)
    {
        lq->rear = lq->front->next;
        free(lq->front);
        lq->front = lq->rear;
    }

    return true;
}
/*将队列清空,但是保留头结点*/
bool ClearQueue(LinkQueue *lq)
{
    if(lq->front == lq->rear)
    {
        return true;
    }
    cout << "Clear Queue ..." << endl;
    QNodePtr p = lq->front->next;
    QNodePtr q = NULL;

    lq->front->next = NULL;
    lq->rear = lq->front;

    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }

    return true;
}
/*判断队列是否为空*/
bool IsEmptyQueue(LinkQueue lq)
{
    return lq.front == lq.rear;
}

/*返回队列中结点的个数*/
int QueueLength(LinkQueue lq)
{
    int count = 0;
    if(lq.front == NULL)//队列没有初始化
    {
        return 0;
    }
    QNodePtr p = lq.front->next;
    while(p)
    {
        p = p->next;
        count++;
    }

    return count;
}
/*返回队列的队头元素*/
bool GetTop(LinkQueue *lq, QElemType *e)
{
    QNodePtr p;
    if(lq->front == lq->rear)
    {
        return false;
    }
    p = lq->front->next;
    *e = p->data;

    cout << "Get Top Item: " << *e << endl;

    return true;
}

/*遍历队列中的各个元素*/
bool QueueTraverse(LinkQueue lq)
{
    if(lq.front == lq.rear)
    {
        return false;
    }
    cout << "Queue Traverse ..." << endl;
    QNodePtr p = lq.front->next;

    while(p)
    {
        cout << p->data <<‘ ‘;
        p = p->next;
    }
    cout << endl;

    return true;
}

void main(void)
{
    LinkQueue lq;
    InitQueue(&lq);
    for(int i = 0; i < 5; i++)
    {
        EnQueue(&lq, i);
    }

    QueueTraverse(lq);
    int result;
    GetTop(&lq, &result);
    DeQueue(&lq, &result);
    if(!IsEmptyQueue(lq))
    {
        cout << "Queue Length: " << QueueLength(lq) << endl;
    }
    QueueTraverse(lq);
    DestroyQueue(&lq);

    system("pause");
}

执行结果:

总的来说,在可以确定队列长度最大值的情况下,建议使用循环队列;如果无法预估队列的长度时,则用链队列。

时间: 2024-07-30 23:27:54

数据结构:队列的链式存储结构的相关文章

队列的链式存储结构及实现

ref : https://blog.csdn.net/qq_29542611/article/details/78907339 队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点.如果 空队列时,front和rear都指向头结点. 入队操作: 在队尾添加元素,先将队尾元素的next指向添加的元素,然后将队尾指针重新指向新的队尾即可. 出队操作: 头结结点指向的结点即为队头结点,出

数据结构-队列-顺序链式存储

定义 队列(Queue):队列简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除.向队列中插入元素称为入队或进队:删除元素称为出队或离队. 队列的操作 队列不可以读取对中间的元素. 队列的存储结构 顺序存储 链式存储 顺序存储 队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front 和rear分别指示队头元素和队尾元素的位置. 设队头指针指向队头元素,队尾指针指向队尾 元素的下一个位置(也可以让rear指向队尾元素,front指向队头元

队列的链式存储结构(C语言实现)

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define OK 1 5 #define ERR 2 6 #define TRUE 1 7 #define FALSE 0 8 9 typedef int status; //定义函数返回的状态,OK & ERR 10 typedef char datatype; //定义队列中每个元素的数据类型,这里暂定为字符型 11 12 typedef struct LinkQueue_

队列的链式存储结构

1 链队列的存储结构 将对头指针front指向链队列的头结点,队尾指针rear指向终端结点. 空队列时,头指针front和尾指针rear都指向头结点. 链队列的存储结构为: typedef int QElemType; typedef struct QNode { //结点结构 QElemType data; struct QNode *next; }QNode; typedef struct QNode * QueuePtr; typedef struct { //队列的链表结构 QueueP

(源代码见大话数据结构)线性表—队列的链式存储结构-&gt;出队&amp;入队&amp;建立空队列

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 #define OVERFLOW 0 typedef int Status; typedef int QElemType; typedef struct QNode//标识符和类型名一样不知道什么用意.. { QElemType data; stru

Java数据结构系列之——队列(3):队列的链式存储结构及其实现

package queue.linkQueue; public class Node { // 数据域 Object element; // 指针域 Node next; // 头结点初始化 public Node(Node next) { this.next = next; } // 非头结点初始化 public Node(Object element, Node next) { this.element = element; this.next = next; } } ***********

队列的链式存储结构的实现2 —— 出队查看队首尾元素计算元素个数

// Filename : list_queue.c // Author : LupingChen // Data : 2015.05.30 // Content : create\destory\full\empty\push #include <stadio.h> #include <stdlib.h> //定义节点数据类型 typedef struct Node { int data;//节点数据 struct Node* next;//记录下一节点地址 } Node; //

队列的链式存储结构的实现1 —— 创建销毁判断满空入队

// Filename : list_queue.c // Author : LupingChen // Data : 2015.05.30 // Content : create\destory\full\empty\push #include <stadio.h> #include <stdlib.h> //定义节点数据类型 typedef struct Node { int data;//数据 struct Node* next;//记录下一节点地址 } Node; //定义

队列的链式存储结构的实现3——完结编

// Filename : list_queue.c // Authot : LupingChen // Data : 2014.06.01 // Content : main\clear #include <stdio.h> #include <stdlib.h> //定义节点数据类型 typedef struct Node { int data;//节点数据 struct Node* next;//记录下一节点地址 } Node; //定义队列数据类型 typedef stru