C ++单链表 - 使用哨兵

时间:2016-10-18 06:15:08

标签: c++ linked-list singly-linked-list deque sentinel

我想在我的链表实现中使用一个标记来简化一些功能。

然而,Deque() = default;构造函数让我很困惑。

它如何知道它必须设置head = tail后跟一个哨兵 当我没有/不能定义它时,没有元素的Deque链表的初始构造?

这只是我正在努力学习和理解的课程之一。我们没有被要求使用哨兵,但我想。

Deque.cpp

//2 example functions using sentinels
#include "Deque.h"
#include <iostream>
#include <memory>

using std::cout;
using std::endl;

bool Deque::empty() const
{
    if ((head->next == tail) && (tail->next == sentinel))
        {return true;}
    return false;
}


int Deque::size() const
{
    int size_val = 0;
    const Node* p = head.get();

    while ( p != sentinel)
        {
        size_val++;
        p = p->next.get();
        }
    return size_val;
}

Deque.h

#include "Node.h"
#include <memory>

class Deque{
    public:
        Deque() = default;
        Deque(const Deque&);
        ~Deque(); // const space
        Deque& operator=(const Deque&);

        bool empty() const;
        int size() const;

    private:
    friend Node;
        std::unique_ptr<Node> sentinel;
        std::unique_ptr<Node> head ;
        std::unique_ptr<Node> tail ;
};

Node.h

#ifndef NODE_H
#define NODE_H

#include <iostream>
#include <memory>

class Node {
public:
    Node(const Node& n) : val{n.val}, next{}
    {
    }
    Node(int v, std::unique_ptr<Node> n) : val{v}, next{move(n)}
    {
    }
    Node(int v) : val{v}
    {
    }

private:
    int val = 0;
    std::unique_ptr<Node> next = nullptr;

    friend class Deque;
    friend std::ostream& operator<<(std::ostream&, const Node&);
};

#endif

0 个答案:

没有答案