美文网首页
链式队列

链式队列

作者: 又是一只小白鼠 | 来源:发表于2020-04-09 14:16 被阅读0次

    队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点。

    • 空队列时,front和rear都指向头结点。
    • 入队操作时,先将头结点指向新结点,再将队尾指针重新指向新结点。
    • 出队操作时,先将头结点指向p的next结点,再判断p结点是不是该队列唯一结点,L->rear= p,若是front和rear都指向头结点,释放p的空间。

    结构体

    typedef int ElemType;
    typedef struct QNode {//链表结点
        ElemType data;
        struct QNode *next;
    }QNode, *QueuePtr;
    typedef struct {//队列指针,分别指向队首和队尾
        QueuePtr front;
        QueuePtr rear;
    }LinkQueue;
    

    单链表新建结点

    //新建结点
    QueuePtr QueueNode(ElemType data) {
        QueuePtr node = (QNode *)malloc(sizeof(QNode));
        node->next = NULL;
        node->data = data;
        return node;
    }
    

    初始化队

    //初始化队列
    void InitLinkQueue(LinkQueue *L) {
        L->front = L->rear = (QNode *)malloc(sizeof(QNode));
        L->front->next = NULL;
    }
    

    判空

    int EmptyLinkQueue(LinkQueue *L) {
        if (L->front == L->rear) {
            return 1;
        }
        return 0;
    }
    

    入队

    //入队
    int EnterLinkQueue(LinkQueue *L, ElemType data) {
        QueuePtr new = QueueNode(data);
        L->rear->next = new;
        L->rear = new;
        return 1;
    }
    

    出队

    //出队
    int DeleteLinkQueue(LinkQueue *L, ElemType *data) {
        if (L->front == L->rear) {
            printf("空队列...\n");
            return 0;
        }
        QueuePtr p = L->front->next;
        *data = p->data;
        L->front->next = p->next;
        if (p == L->rear) {
            L->front = L->rear;
        }
        free(p);
        return *data;
    }
    

    获取队头元素

    //获取队头元素
    int GetFrontLinkQueue(LinkQueue L, ElemType *data) {
        if (L.front == L.rear) {
            printf("空队列...\n");
            return 0;
        }
        *data = L.front->next->data;
        return *data;
    }
    

    销毁队列

    //销毁队列
    void ClearLinkQueue(LinkQueue *L) {
        while (L->front != NULL) {
            L->rear = L->front->next;
            free(L->front);
            L->front = L->rear;
        }
    }
    

    测试

    void testLinkQueue() {
        LinkQueue q;
        InitLinkQueue(&q);
        int x;
        EnterLinkQueue(&q, 23);
        EnterLinkQueue(&q, 45);
        EnterLinkQueue(&q, 90);
        GetFrontLinkQueue(q, &x);
        printf("GetFrontLinkQueue---%d\n", x);
        DeleteLinkQueue(&q, &x);
        printf("DeleteLinkQueue----%d\n", x);
    }
    

    相关文章

      网友评论

          本文标题:链式队列

          本文链接:https://www.haomeiwen.com/subject/vabqmhtx.html