Как мне отформатировать пространство имен со всеми различными связанными списками? - PullRequest
0 голосов
/ 23 декабря 2018

Я хочу создать очень простой список имен, похожий на std, с такими библиотеками, как «поодиночке» и «вдвойне».Как я могу модульный код, чтобы я мог использовать только переменные, которые мне нужны (круговые против некруглых)?

Я полагаю, что я могу просто добавить 'struct node * prev' к структуре, которую использует список, но если пользователь решит не делать циклический, это всегда будет 'nullptr', вызывая ненужныепеременная.Второй способ, который я представляю, - это иметь 2 разных класса ...

namespace list{
    struct snode{
        int data;
        struct snode* next;
    };

    class singly{
        public:
            singly();
            singly(unsigned long long amount=0, bool circular=0, bool userCreated=0, bool empty=0);
            ~singly();

            void create(unsigned long long amount=0, bool circular=0, bool userCreated=0, bool empty=0);
            void display();
            void destroy();
        private:
            snode* HEAD;
            unsigned long long amount;

            bool empty;
            bool circular;
            snode* TAIL;
    };
}

Я ожидаю, что с этим пространством имен будет сделано следующее ..

include "singly.h"

using namespace list;

singly list;

list.create(5);

list.display();

list.destroy();

или что-то не будет использоваться пространством именеще ...

list::singly list(7, 1, 0, 1);

list.display();

list.~list();

Хотя это не задание или что-то еще, я хочу, чтобы это было моим делом, когда мне нужно создать связанный список когда-либо в моей жизни.В конце концов, я хочу создать «дерево» пространства имен и продолжить его.Я почти хочу, чтобы это было так же легко использовать как абстрактный тип данных 'string'.

1 Ответ

0 голосов
/ 23 декабря 2018

короткий ответ

Это невозможно

длинный ответ

Я солгал (иш).Создайте базовый строгий, содержащий данные, затем создайте snode, который наследует данные, реализуя указатель базового класса.При просмотре списка проверьте, не сработал ли он.

struct A {
    int data;
    // make it polymorphic for the conversion
    virtual void function() {return;}
};

struct B : A {
    struct A* next;
};

int main()
{
    struct A end;
    struct B beginning;
    beginning.next = &end;
    struct B* buffer = &beginning;
    while(true) {
        buffer = dynamic_cast<struct B*>(buffer->next);
        if (buffer == nullptr) break;
    }
}

почему это довольно неактуально

Вы экономите только максимум (0 байт) памяти на список.Вы сохраняете его, используя структуру A, но структура A эффективно имеет также функцию ptr / address, которая занимает место.Это, однако, может быть исправлено компилятором.И для написания худшего кода требуется больше времени, и общая эффективность будет хуже.

...