zl程序教程

您现在的位置是:首页 >  Java

当前栏目

循环队列出队-单个指针下循环链表的入队与出队

2023-02-18 16:47:34 时间

  循环链表的入队出队

  题目是这样的: 设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。编写相应的入队和出队程序。

  如果带头尾指针那就很简单了,不带头尾指针只能在函数中新建工作指针来操作。

  思考方向

  队列嘛,先进先出,用循环链表存储,再有个尾指针,逻辑结构就是这样的

  入队

  入队分三步:

  新结点指向头结点

  尾结点指向新节点

  尾指针指向新的尾结点

  出队

  先进先出嘛,头结点删了就行

  理论上直接尾结点指向第二个就完事了

  但这样只是找不到了原来的头结点,它依然是存在于内存中的,虽说眼不见为净吧

  ,但它确确实实是存在的循环队列出队循环队列出队,一旦堆积,这队列容量就会越来越小。

  所以还是要把它删除掉的(delete)

  具体代码

  存储数据就以int为例,其他的自己适应性更改就行

  结点

   struct Node{

        int data;
        Node* next;
    };//创建结构体——结点

  循环队列

   class CirQueue {

    private:
        Node* p;
    public:
        CirQueue();
        CirQueue(int a[], int n);
        void EnQueue(int a);
        void DeQueue();
    };
    CirQueue::CirQueue() {
        p = nullptr;
    }
    CirQueue::CirQueue(int a[], int n) {
        p = new Node;
        p->data = a[0];
        Node* q = p;//存储首地址,用于最后尾巴指过来
        for (int i = 1; i next = new Node;
            p = p->next;
            p->data = a[i];        
        }
        p->next = q;
    }//初始化循环队列

  入队

void CirQueue::EnQueue(int a) {
    Node* q = new Node;
    q->data = a;
    q->next = p->next;//第一步
    p->next = q;//第二步
    p = q;//第三步
    cout 
[1]: https://xuan.ddwoo.top/index.php/archives/528/
[2]: https://xuan.ddwoo.top/index.php/archives/530/
[3]: https://xuan.ddwoo.top/index.php/archives/535/                
        本文共 345 个字数,平均阅读时长 ≈ 1分钟