• 数据结构——队列及循环队列


    说明:严蔚敏的《数据结构》(C语言版)学习笔记,记录一下,以备后面查看。


    #include <stdio.h>
    #include <stdlib.h>
    
    #define OK 1;
    #define ERROR -1;
    
    typedef int QElemType;
    typedef int Status;
    
    //定义队列节点
    typedef struct QNode{
        QElemType data;
        struct QNode *next;
    }QNode, *QueuePtr;
    
    //队列
    typedef struct{
        QueuePtr front;  //队头指针
        QueuePtr rear;   //队尾指针
    }LinkQueue;
    
    //初始化队列
    Status InitQueue(LinkQueue *q){
        q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
        if (!q->front) return ERROR;
        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 EnQueue(LinkQueue *q, QElemType e){
        QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
        if(!p) return ERROR;
        p->data = e;
        p->next = NULL;
        q->rear->next = p; //队列末尾指向p
        q->rear = p; //p记为尾指针
        return OK;
    }
    
    //出队列
    Status DeQueue(LinkQueue *q, QElemType *e){
        if(q->front == q->rear) return ERROR;
        QueuePtr p = q->front->next; //指向队列头部第一个元素
        *e = p->data;
        q->front->next = p->next;
        if(q->rear == p) q->rear = q->front;
        free(p);
        return OK;
    }

    初始化的时候,让front和rear都等于0,此时队列元素个数是0,当入队4个元素后如下图


    此时对队列元素的个数是 rear - front = 4, 假如队列变为下面的样子,rear < front


    队列中空一格的原因是为了区别队列是“空”还是“满”,当队列尾指针的下一个位置是头指针则说明队列满了。

    #include <stdio.h>
    #include <stdlib.h>
    
    #define OK 1
    #define ERROR -1
    #define MAXQSIZE 100 //最大队列长度
    
    typedef int QElemType;
    typedef int Status;
    
    //循环队列
    typedef struct{
        QElemType *base;
        int front;
        int rear;
    }SqQueue;
    
    //初始化循环队列
    Status InitQueue(SqQueue *q){
        q->base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
        if (!q) return ERROR;
        q->front = q->rear = 0;
        return OK;
    }
    
    //获取队列长度
    int QueueLength(SqQueue *q){
        return (q->rear - q->front + MAXQSIZE) % MAXQSIZE;
    }
    
    //入队
    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;
    }

  • 相关阅读:
    [go]go addressable 详解
    [go]灵活的处理json与go结构体
    [django]django内置的用户模型
    [go]文件读写&io操作
    *2.3.2_加入env
    UVM_INFO
    uvm_config_db在UVM验证环境中的应用
    *2.2.4 加入virtual interface
    *2.2.3 加入objection机制
    2.2.2 加入factory机制
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468658.html
Copyright © 2020-2023  润新知