链式队列 + 顺序队列 + 顺序循环队列

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

#define OK 1
#define FALSE 0
#define ERROR -1

typedef int Status;
typedef int QElemType;

typedef struct QNode
{
    QElemType data;
    QNode *next;
}*QueuePtr;

struct LinkQueue
{
    QueuePtr front,rear;//队头,队尾指针
};

Status InitQueue(LinkQueue &Q)
{
    Q.front->next = NULL;
    return OK;
}

Status DestroyQueue(LinkQueue &Q)
{
    while(Q.front){
        Q.rear = Q.front->next;
        free(Q.front);
        Q.front = Q.rear;
    }
    return OK;
}

Status ClearQueue(LinkQueue &Q)
{
    QueuePtr p,q;
    Q.rear = Q.front;
    p = Q.front->next;
    Q.front->next = NULL;
    while(p){
        q = p;
        p = p->next;
        free(q);
    }
    return OK;
}

Status QueueEmpty(LinkQueue Q){
    if(Q.front == Q.rear)
        return true;
    else
        return false;
}

int QueueLength(LinkQueue Q){
    int i = 0;
    QueuePtr p;
    p = Q.front;
    while(Q.rear != Q.front){
        i++;
        p = p->next;
    }
    return i;
}

Status GetHead(LinkQueue Q,QElemType &e){
    QueuePtr p;
    if(Q.front == Q.rear)
        return ERROR;
    p = Q.front->next;
    e = p->data;
    return OK;
}

Status EnQueue(LinkQueue &Q,QElemType e){
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
    return OK;
}

Status DeQueue(LinkQueue &Q,QElemType &e){
    QueuePtr p;
    if(Q.front == Q.rear)
        return ERROR;
    p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;
    if(Q.rear == p)
        Q.rear = Q.front;
    free(p);
    return OK;
}

Status QueueTraverse(LinkQueue Q,void(*vi)(QElemType))
{
    QueuePtr p;
    p = Q.front->next;
    while(p){
        vi(p->data);
        p = p->next;
    }

    printf("\n");
    return OK;
}

int main()
{
    return 0;
}

顺序队列:

//顺序队列
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define FALSE 0
#define ERROR -1
#define OVERFLOW -1
#define MAXQSIZE 20 

typedef int Status;
typedef int QElemType;

struct SqQueue
{
    QElemType *base;
    int front;
    int rear;
};

Status InitQueue(SqQueue &Q){
    Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
    //
    Q.front = Q.rear = 0;
    return OK;
}

Status DestroyQueue(SqQueue &Q){
    if(Q.base)
        free(Q.base);
    Q.base = NULL;
    Q.front = Q.rear = 0;
    return 0;
}

Status ClearQueue(SqQueue &Q){
    Q.front = Q.rear = 0;
    return OK;
}

Status QueueEmpty(SqQueue Q){
    if(Q.front == Q.rear)
        return true;
    else
        return false;
}

int QueueLength(SqQueue Q){
    return (Q.rear - Q.front);
}

Status GetHead(SqQueue Q,QElemType &e){
    if(Q.front == Q.rear)
        return ERROR;
    e = *(Q.base + Q.front);
    return OK;
}

Status EnQueue(SqQueue &Q,QElemType e){
    if(Q.rear >= MAXQSIZE)
    {
        Q.base = (QElemType *)realloc(Q.base,(Q.rear + 1) * sizeof(QElemType));
        //
    }
    *(Q.base + Q.rear) = e;
    Q.rear++;
    return OK;
}

Status DeQueue(SqQueue &Q,QElemType e){
    if(Q.front == Q.rear)
        return ERROR;
    e = Q.base[Q.front];
    Q.front = (Q.front + 1);
    return OK;
}

Status QueueTraverse(SqQueue Q,void(*vi)(QElemType)){
    int i ;
    i = Q.front;
    while(i != Q.rear){
        vi(*(Q.base + i));
        i++;
    }
    printf("\n");
    return OK;
}

顺序循环队列:

//顺序循环队列
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define FALSE 0
#define ERROR -1
#define OVERFLOW -1
#define MAXQSIZE 5 

typedef int Status;
typedef int QElemType;

struct SqQueue
{
    QElemType *base;
    int front;
    int rear;
};

Status InitQueue(SqQueue &Q){
    Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
    //
    Q.front = Q.rear = 0;
    return OK;
}

Status DestroyQueue(SqQueue &Q){
    if(Q.base)
        free(Q.base);
    Q.base = NULL;
    Q.front = Q.rear = 0;
    return 0;
}

Status ClearQueue(SqQueue &Q){
    Q.front = Q.rear = 0;
    return OK;
}

Status QueueEmpty(SqQueue Q){
    if(Q.front == Q.rear)
        return true;
    else
        return false;
}

int QueueLength(SqQueue Q){
    return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

Status GetHead(SqQueue Q,QElemType &e){
    if(Q.front == Q.rear)
        return ERROR;
    e = *(Q.base + Q.front);
    return OK;
}

Status EnQueue(SqQueue &Q,QElemType e){
    if((Q.rear + 1) % MAXQSIZE == Q.front) //队满
        return ERROR;
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXQSIZE;
    return OK;
}

Status DeQueue(SqQueue &Q,QElemType e){
    if(Q.front == Q.rear)
        return ERROR;
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % MAXQSIZE;
    return OK;
}

Status QueueTraverse(SqQueue Q,void(*vi)(QElemType)){
    int i ;
    i = Q.front;
    while(i != Q.rear){
        vi(*(Q.base + i));
        i = (i + 1) % MAXQSIZE;
    }
    printf("\n");
    return OK;
}
时间: 2024-10-23 19:31:30

链式队列 + 顺序队列 + 顺序循环队列的相关文章

数据结构之队列(三)——循环队列

循环队列采用顺序存储的方式(数组),基本思想是通过一个数组存储数据,两个下标front和rear分别指向队头和队尾 由于假溢出现象:采用循环队列,又由于循环队列无法判断队列是空还是满,所以采用损失一个元素为空的代价来分别队列为空还是为满 与链队列不同的是: 循环队列的队头指针(下标)不是指向什么头结点,而是直接指向当前队头的元素 循环队列的队尾指针(下标)不是指向最后一个元素,而是指向最后一个元素的下一个下标 当循环队列为空的时候,队尾和队头下标均指向啊a[0] 循环队列的定义 一个数组存放数据

链式委托的执行顺序是怎样的

分析问题 在前文中已经介绍了链式委托的基本特性是一个以委托组成的链表,而当委托链上的任何一个委托方法被调用时,其后面的所有委托方法将会被依次顺序调用.那读者可能会产生这样的疑问,委托链上的原始顺序是如何形成的呢?回顾一下之前的代码,我们是如何生成一个链式委托的: //申明一个委托变量,并绑定第一个方法 TestMulticastDelegate handler = new TestMulticastDelegate(PrintMessage1); //绑定第二个方法 handler += new

看数据结构写代码(16)顺序队列的实现(循环队列)

循环队列的基本结构如下: front 属性 表示 队头,rear 属性表示 队尾. 在队空时 :q.rear 和 q.front 都为0 ,其余时刻q.rear 指向 队尾的后继节点,q.front指向 队头. 当在队尾插入元素时,q.rear + 1 ,在删除 队头元素时 ,q.front + 1,这样的操作 会造成 "假溢出"问题. 图(d) 就是一种 假溢出 问题,q.rear 指向 空间的边界,再插入 会造成 溢出,但是 实际上 空间 并未满. 为了解决假溢出,将 队列 看成

队列(FIFO)—循环队列、队列的链式存储

1 队列的定义 队列是只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作的线性表. 2 队列的特点 1)先进先出是队列最大的特点,是应用中非常常见的模型,例如排队: 2)队列也属于线性表,线性表的特性队列都拥有. 3 循环队列的实现及关键点 3.1 关键点 1)队列为空的条件:队头指针等于队尾指针,即head == tial: 2)队列中保留一个元素空间,当队列满时,尾指针和头指针之间还剩一个元素空间.队列为满的条件:(tial + 1) % quenceSize == head:

顺序结构的循环队列

//循环队列 #include <stdio.h> #include<stdlib.h> #define MAXSIZE 5 #define status int struct Queue { int* base; int front; int real; }Q; status initQueue(Queue &Q) { Q.base=(int *)malloc(MAXSIZE*sizeof(int)); if(!Q.base) { printf(" 内存分配失败

队列( FIFO ) 循环队列

队列( FIFO ) 数组实现 #include <stdio.h> #define N 64 int main() { int i, n, front, rear, q[2*N]; scanf("%d", &n); for(i = 0; i < n; i++) q[i] = i + 1; front = 0; rear = n; while(rear – front > 0) { printf("%d ", q[front]); f

数据结构-队列的顺序存储(循环队列)

1 #include "stdio.h" 2 #include "stdlib.h" 3 4 #define OK 1 5 #define ERROR 0 6 #define OVERFLOW -1 7 #define MAXQSIZE 100 8 typedef int QElemType; 9 typedef int Status; 10 11 typedef struct 12 { 13 QElemType *base; 14 int front; 15 in

链式基数排序收集的顺序有什么规律

okkq8b室瘴颊蕾簇恐<http://weibo.com/p209p688p/230927983167992529424384?yv20180413> 39798z裁橙僦庇剿料<http://weibo.com/p402p589p/230927983211814600839168?jy20180413> eaj76c猩莆税诶放吮<http://weibo.com/pnwp/230927983045771983069184> gs54z3放撼涡窘赐淘<http:/

javascript的队列,优先队列,循环队列

按书上的来弄的.慢慢理解了. function Queue() { var items = []; this.enqueue = function(element){ items.push(element); } this.dequeue = function(){ return items.shift(); } this.front = function(){ return items[0]; } this.isEmpty = function(){ return items.length =

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

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