队列的链式表示和实现

队列是操作受限的线性表,只允许在队尾插入元素,在队头删除元素,为了便于插入元素,设立队尾指针。这样,插入元素的操作与队列长度无关

队列的链式存储结构

typedef struct QNode
{
    QElemType data;
    QNode *next;
}*QueuePtr;
struct LinkQueue
{
    QueuePtr front, rear;//队头,队尾指针
};

链队列的9个基本操作

void InitQueue(LinkQueue &Q){
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    if (!Q.front) exit(OVERFLOW);
    Q.front->next = NULL;
}

void DestroyQueue(LinkQueue &Q){
    while (Q.front)//Q.front不为空
    {
        Q.rear = Q.front->next;//Q.rear指向Q.front的下一个结点
        free(Q.front);//释放Q.front所指结点
        Q.front = Q.rear;//Q.front指向Q.front的下一个结点
    }
}

void ClearQueue(LinkQueue &Q){
    DestroyQueue(Q);//销毁队列Q
    InitQueue(Q);//重新构造空队列
}

Status QueueEmpty(LinkQueue Q){
    if (Q.front->next == NULL) return TRUE;
    else return FALSE;
}

int QueueLength(LinkQueue Q){
    int i = 0;
    QueuePtr p = Q.front;//p指向头结点
    while (Q.rear != p)//p所指不是尾结点
    {
        i++;
        p = p->next;//p指向下一个结点
    }
    return i;
}

Status GetHead(LinkQueue Q, QElemType &e){
    if (Q.front == Q.rear) return ERROR;//队列空
    QueuePtr p = Q.front->next;//p指向队头结点
    e = p->data;//将队头元素的值赋给e
    return OK;
}

void EnQueue(LinkQueue &Q, QElemType e){//插入元素e为队列Q的新的队尾元素
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));//动态生成新结点
    if (!p) exit(OVERFLOW);
    p->data = e;
    p->next = NULL;//新结点的指针域为空
    Q.rear->next = p;//原队尾结点的指针指向新结点
    Q.rear = p;//尾指针指向新结点
}

Status DeQueue(LinkQueue &Q, QElemType &e){//若队列Q不空,删除Q的队头元素
    QueuePtr p;
    if (Q.front == Q.rear) return ERROR;//队列空
    p = Q.front->next;//p指向队头结点
    e = p->data;//将队头元素的值赋给e
    Q.front->next = p->next;//头结点指向下一个结点
    if (Q.rear == p)//删除的是队尾结点
        Q.rear = Q.front;//修改队尾指针指向头结点(空队列)
    free(p);//释放队头结点
    return OK;
}

void ListTraverse(LinkQueue Q, void(*visit)(ElemType&)){
    QueuePtr p = Q.front->next;//p指向队头结点
    while (p)//p指向结点
    {
        visit(p->data);
        p = p->next;
    }
    printf("\n");
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-13 11:01:30

队列的链式表示和实现的相关文章

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

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

顺序队列和链式队列的实现

队列是一种常用的数据结构,它跟栈一样,操作都受到限制,队列只允许从一端进数据,另一端出数据.队列跟栈不同,栈是一种"后进先出"的模式,而队列是一种"先进先出"的操作模式.就好比日常排队一样,先排队的先出,后排队的后出.例如,进入队列的顺序是1,2,3,4,5则出队列的顺序是1,2,3,4,5(只考虑一次性出列的情况). 队列也分顺序队列和链式队列,跟顺序栈和链表栈一样,顺序队列同样是基于数组实现,链式队列则是基于链表实现. 顺序队列: //顺序队列 #include

[转载]队列的链式存储

申明:转自    http://www.cnblogs.com/Romi/archive/2012/08/28/2660954.html 1 //队列的链式存储.C 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<malloc.h> 5 6 //定义队列 7 typedef struct node { 8 int data; 9 struct node *next; 10 }Queue; 11 12 //定义对手指

数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现

一.简介 FIFO. 二.头文件 1 //3_4_part1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-9 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 61 9 #include <cstdio> 10 #include "head.h" 11 #define QElemType int 12 //

队列的链式实现

队列的链式实现: 在这个队列里面:r 为低, f 为顶 //队列(链式) #include <iostream> using namespace std; typedef int DataType; struct QNode { DataType data; struct QNode *link; }; typedef struct QNode *PNode; //r为低 f为顶 struct LinkQueue { PNode f; PNode r; }; typedef struct Li

队列的链式存储---链表实现

/* 队列的链式存储 */ /* with no header */ struct Node; struct LinkQueue; typedef struct Node *PtrToNode; typedef struct LinkQueue *PtrTorf; struct Node{ ElementType X; PtrToNode Next; }; struct LinkQueue{ PtrToNode rear; PtrToNode front; }; int IsEmpty(PtrT

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

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

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

链队列的实现方法: 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点.空队列时,front和rear都指向头节点. 注意:这里的实现是有头结点的,在队列的初始化函数中要为头结点开辟空间. 链队列的实现代码: #include <iostream> #include <stdlib.h> using namespace std; /**********************

队列(链式)

队列,是一种先进先出的线性表,它只允许在队头删除,在队尾插入,链式队列和单链表操作类似,但是有队首指针和队尾指针,下面是链式队列的表示和实现: #include <iostream> using namespace std; //队列的链式表现与实现 struct QNode { int data; QNode *next; }; struct LinkQueue { QNode * front; QNode * rear; }; bool InitQueue(LinkQueue &q

队列的链式存储---链表实现(有头结点)

/* 队列的链式存储 */ /* with header */ /* with no typedef */ struct Node{ ElementType Ele; struct Node *Next; }; struct LinQ{ struct Node *rear; struct Node *front; }; struct LinQ * CreateQ( void ) { struct LinQ *Ptr; struct Node *header; Ptr = malloc(sizeo