C односвязный список — с использованием часового

#c #linked-list #singly-linked-list #deque #sentinel

#c #связанный список #single-linked-list #деке #страж

Вопрос:

Я хотел бы использовать sentinel в моей реализации связанного списка, чтобы упростить некоторые функции.

Однако Deque() = defau< конструктор сбивает меня с толку.

Откуда он знает, что он должен установить head = tail, за которым следует sentinel для первоначального построения Deque связанного списка без элементов, когда я не могу / не могу определить его для этого?

Это просто домашнее задание для одного из моих классов, которое я пытаюсь проработать и понять. Нас не просили использовать sentinels, но я бы хотел.

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) amp;amp; (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 Dequeamp;);
        ~Deque(); // const space
        Dequeamp; operator=(const Dequeamp;);

        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 Nodeamp; 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::ostreamamp; operator<<(std::ostreamamp;, const Nodeamp;);
};

#endif
  

Комментарии:

1. Я предполагаю, что здесь означает sentinel NULL , потому что после tail вам нечего будет получить или пройти.

2. Если конструктор сбивает вас с толку, почему вы написали его так?

3. исправьте это: if ((head->next = tail) amp;amp; (tail-> next = sentinel)) . изменить на ==

4. @molbdnilo его домашнее задание — я не могу это изменить.