zoukankan      html  css  js  c++  java
  • 队列的链式存储实现

        l链式队列的形式如下:    

    front->Data1->Data2->Data3->...->DataN(rear)

        front存储队头数据节点的前一个节点地址,rear存储队尾数据节点的地址

        队列结构如下:

    #define OK        1
    #define ERROR     0
    #define OVERFLOW -1
    
    typedef int Status;
    typedef int QElemType;
    typedef struct QNode
    {
        QElemType data;
        struct QNode *next;
    }QNode;
    typedef struct
    {
        QNode *front;//指向队头的前一个指针
        QNode *rear;//指向队尾
    }LinkQueue;

        具体实现如下:

    void InitQueue(LinkQueue *Q)
    {
        assert(Q);
    
        Q->front = Q->rear = (QNode *)malloc(sizeof(QNode));
        if (!Q->front)
            exit(OVERFLOW);
        Q->rear->next = NULL;
    }
    
    void DestroyQueue(LinkQueue *Q)
    {
        assert(Q);
        QNode *tmp;
    
        tmp = Q->front;
        while (tmp)
        {
            Q->front = tmp->next;
            free(tmp);
            tmp = Q->front;
        }
        //Q->front已经为NULL了
        Q->rear = NULL;
    }
    
    Status QueueEmpty(LinkQueue *Q)
    {
        assert(Q);
    
        return Q->rear == Q->front;
    }
    
    void EnQueue(LinkQueue *Q, QElemType e)
    {
        assert(Q);
        QNode *tmp;
    
        tmp = (QNode *)malloc(sizeof(QNode));
        if (!tmp)
            exit(OVERFLOW);
        tmp->data = e;
        tmp->next = NULL;
        Q->rear->next = tmp;
        Q->rear = tmp;
    }
    
    Status DeQueue(LinkQueue *Q, QElemType *e)
    {
        assert(Q);
        QNode *tmp;
    
        if (QueueEmpty(Q))
            return ERROR;
        
        tmp = Q->front;
        //因为front存储队头的前一个节点
        //所以要Q->front=tmp->next得到队头节点
        Q->front = tmp->next;
        free(tmp);
        if (e)
            *e = Q->front->data;
    
        return OK;
    }
    
    Status GetHead(LinkQueue *Q, QElemType *e)
    {
        assert(Q&&e);
    
        if (QueueEmpty(Q))
            return ERROR;
        *e = Q->front->next->data;
        return OK;
    }
    
    void QueueTraverse(LinkQueue *Q, void(*visit)(QElemType *))
    {
        assert(Q&&visit);
        QNode *tmp;
    
        tmp = Q->front->next;
        while (tmp)
        {
            visit(&tmp->data);
            tmp = tmp->next;
        }
    }
  • 相关阅读:
    用变量构造函数检查变量类型
    HTML5的File API读取文件信息
    jQuery插件中的this指的是什么
    了解babel
    了解.gitignore
    高德地图画正六边形
    编写可维护性的js读书笔记
    百度地图遇到的问题
    实用的两个移动端demo
    git基本操作总结
  • 原文地址:https://www.cnblogs.com/inori/p/5017115.html
Copyright © 2011-2022 走看看