C语言实现循环链表队列 (无头指针)

本文使用C语言实现一个基于带头结点的循环链表的队列数据结构,该队列仅使用一个指针指向队尾元素结点,没有头指针。

1. 队列的初始化

void initQueue(LinkList &rear) {
    rear = (LinkList)malloc(sizeof(LNode));
    rear->next = rear;
}

2. 入队列

void enQueue(LinkList &rear, ElemType x) {
    LinkList p = (LinkList)malloc(sizeof(LNode));
    p->data = x;
    p->next = rear->next;
    rear->next = p;
    rear = p;
}

3. 出队列

bool deQueue(LinkList &rear, ElemType &x) {
    if (rear == rear->next) {
        return false;
    }
    LinkList p = rear->next->next;
    x = p->data;
    rear->next->next = p->next;
    if (p == rear) {
        rear = rear->next;
    }
    free(p);
    return true;
}

注意:

  • 以上代码中的 LinkList 是一个指向节点的指针,ElemType 是节点数据类型。
  • initQueue() 函数初始化队列,创建一个空队列,将 rear 指针指向头结点,头结点的 next 指针指向自身,形成一个循环链表。
  • enQueue() 函数将元素 x 入队,创建一个新的节点 p,并将 p 插入到 rear 指针指向的节点之前。最后将 rear 指针指向新节点 p
  • deQueue() 函数将队首元素出队。首先判断队列是否为空。如果不为空,则将 rear 指针指向的节点的 next 指针指向的节点(即队首元素)出队,将出队元素的值赋值给 x。最后将 rear 指针指向出队元素的下一个节点(如果出队元素是 rear 指针指向的节点,则将 rear 指针指向下一个节点)。

希望本文能够帮助您理解循环链表队列的实现方法。


原文地址: https://www.cveoy.top/t/topic/jBem 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录