基本数据结构之队列的链式表示

该队列为链式队列,初建队列时,队头和队尾均指向头结点,头结点中不存放数据,只存放指针,头结点的下一个节点才开始存放数据,这这样做的目的是为了在入队和出队时方便对队列的操作,而不用考虑特殊情况。

C语言源代码

#include<stdio.h>
#include<stdlib.h>  

typedef struct Node
{
    int data;
    struct Node *pNext;
}NODE,*PNODE;  

typedef struct Queue
{
    PNODE front;  //队头指针
    PNODE rear;   //队尾指针
}QUEUE,*PQUEUE;  

PQUEUE create_queue();
bool is_empty(PQUEUE);
void en_queue(PQUEUE, int);
bool de_queue(PQUEUE,int *);
void destroy_queue(PQUEUE);
void traverse_queue(PQUEUE);  

int main()
{
    int data_de = 0;         //用来保存出队的元素值  

    //创建队列并进行入队测试
    PQUEUE pS = create_queue();
    en_queue(pS,2);
    en_queue(pS,4);
    en_queue(pS,6);
    traverse_queue(pS);  

    //出队测试
    if(de_queue(pS,&data_de))
        printf("delete succeed,the deleted data is: %d\n",data_de);
    else
        printf("queue is empty! delete falied!\n");
    traverse_queue(pS);  

    //销毁队列测试
    destroy_queue(pS);
    printf("queue destroyed!\n");
    traverse_queue(pS);  

    return 0;
}  

/*
更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/
创建一个空队列,队头指针和队尾指针都指向头结点,
头结点中不存放数据,只存放指针
*/
PQUEUE create_queue()
{
    PQUEUE pS = (PQUEUE)malloc(sizeof(Queue));
    pS->front = (PNODE)malloc(sizeof(NODE));
    if(!pS || !pS->front)
    {
        printf("pS or front malloc failed!!");
        exit(-1);
    }
    else
    {
        pS->rear = pS->front;
        pS->front->pNext = NULL;
    }
    return pS;
}  

/*
判断队列是否为空
*/
bool is_empty(PQUEUE pS)
{
    if(pS->front == pS->rear)
        return true;
    else
        return false;
}  

/*
进队函数,从队尾进队,队头指针保持不变
*/
void en_queue(PQUEUE pS, int e)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if(!pNew)
    {
        printf("pNew malloc failed");
        exit(-1);
    }
    else
    {
        pNew->data = e;
        pNew->pNext = NULL;
        pS->rear->pNext = pNew;
        pS->rear = pNew;
    }
    return;
}  

/*
出队函数,从队头出队,队尾指针保持不变,但当最后一个元素出队时,
需要对队尾指针重新赋值,使其指向头结点
*/
bool de_queue(PQUEUE pS,int *pData)
{
    if(is_empty(pS))
        return false;
    else
    {
        PNODE p = pS->front->pNext;
        *pData = p->data;
        pS->front->pNext = p->pNext;  

        //这里是队列头元素出队的特殊情况,一般情况下,删除队头元素时
        //仅需修改头结点中的指针,但当队列中最后一个元素被删除时,
        //队列尾指针也丢失了,因此需对队尾指针重新赋值(指向头结点)。
        if(pS->rear == p)
            pS->rear = pS->front;
        free(p);
    }
    return true;
}  

/*
遍历队列,从对头向队尾依次输出队中的元素
*/
void traverse_queue(PQUEUE pS)
{
    if(is_empty(pS))
        printf("there is no data in the queue!\n");
    else
    {
        PNODE pCurrent = pS->front->pNext;
        printf("Now datas int the queue are:\n");
        while(pCurrent)
        {
            printf("%d ",pCurrent->data);
            pCurrent = pCurrent->pNext;
        }
        printf("\n");
    }
    return;
}  

/*
销毁队列,头结点也被销毁,最后也将pS节点销毁,并将其指向为空,避免垂直指针的产生
*/
void destroy_queue(PQUEUE pS)
{
    if(is_empty(pS))
        return;
    else
    {
        while(pS->front)
        {
            pS->rear = pS->front->pNext;
            free(pS->front);
            pS->front = pS->rear;
        }
    }
    free(pS);
    pS = 0;
    return;
}

作者:csdn博客 兰亭风雨

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, printf
, 队列
, return
, 结点
, ps
, 队列Queue
尾队列
链式队列的基本操作、队列的链式表示和实现、队列的链式存储结构、链式队列、链式队列的实现,以便于您获取更多的相关知识。

时间: 2024-12-02 06:25:33

基本数据结构之队列的链式表示的相关文章

算法与数据结构之队列的链式存储

#include<stdio.h>#include<malloc.h>#include<windows.h>typedef int elemtype; typedef struct qnode //数据节点的定义{elemtype data;struct qnode *next;}qnode; typedef struct //链队的定义{qnode *front;qnode *rear;}liqueue; void initqueue(liqueue *&q)

数据结构的C++实现之队列的链式存储结构

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列.为了操作上的 方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点.空队列时,front和rear都指向头节点. 示例程序 :(改变自<大话数据结构>) #include<iostream> using namespace std; typedef int ElemType; typedef struct Node { ElemType data; struct Node *nex

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-1后的示意图: 上图中,a0是当前 队头数据元素,an-1是当前 队尾数据元素. 为了

C++中实现队列类链式存储与栈类链式存储的代码示例_C 语言

队列类链式存储 代码: linkqueue.hpp  // 队列类 #pragma once #include "linklist.hpp" template <typename T> class LinkQueue { public: LinkQueue(); ~LinkQueue(); public: int clear(); int append(T &t); int retieve(T &t); int header(T &t); int l

大话数据结构九:队列的链式存储结构(链队列)

1. 链队列的特点: 链队列其实就是单链表,只不过它是先进先出的单链表,为了实现方便,程序中设置了队头(front),队尾(rear)两个指针. 2. Java使用链表实现队列: //结点类,包含结点的数据和指向下一个节点的引用 public class Node<E> { private E data; // 数据域 private Node<E> next; // 指针域保存着下一节点的引用 public Node() { } public Node(E data) { thi

算法与数据结构之栈的链式存储

#include<stdio.h> #include<windows.h> #include<malloc.h> typedef int elemtype; typedef struct linknode //链表的定义 { elemtype data; struct linknode *next; } listack; void initstack(listack *&s) //初始化 { s=(listack *)malloc(sizeof(listack)

基本数据结构:栈的链式表示

以下为操作栈的算法,该栈为动态栈. 在该栈中,pTop指向的节点中存放该栈的栈顶数据,pBottom指向的节点的上一个节点存放该栈的栈底数据,pBottom指向的节点中不存放有效数据,这样做的目的是为了在进行入栈和出栈时方便对栈的操作,而不用考虑特殊情况 操作系统:ubuntu 编译软件:gcc 结果截图:

数据结构之自建算法库——链队(链式队列)

本文针对数据结构基础系列网络课程(3):栈和队列中第10课时队列的链式存储结构及其基本运算的实现. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 链队算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:liqueue.h,包含定义链队数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef LIQUEUE_H_INCLUDED #define LIQUEUE_H_INCLUDED typedef char ElemType; typ

PHP实现的链式操作示例代码

这篇文章主要介绍了PHP实现的链式操作实例.写程序的人都喜欢偷懒,希望少打几行代码,并且让代码看起来很酷. 就好比很多小伙伴在写if-else-的时候会直接使用三元运算符一样. 而用过JS的人应该都见识过js中的链式方法.如 somevars.func().func2()-funcN():这样的写法使得代码更简练,并且作用关系一目了然. 那么在php中可以这么做么,显然也是可以的,但是php与js的差别是,在js中变量本身具有对象的性质,但是php的变量却不是. 现在在很多的PHP的WEB框架中