簡體   English   中英

我應該如何用所有不同的鏈表設置格式的命名空間?

[英]How should I format a namespace with all different linked lists?

我想使用一個庫(例如“ single”和“ doubly”)創建一個非常簡單的命名空間“ list”(類似於“ std”)。 我該如何對代碼進行模塊化,以便僅使用需要的變量(循環與非循環)?

我想我可以將“ struct node * prev”添加到列表使用的結構中,但是如果用戶決定不進行循環,則它將始終為“ nullptr”,從而導致不必要的變量。 我想象的第二種方式是擁有兩個不同的類...

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();

盡管這不是一項任務,也不是任何事情,但是當我需要創建一個鏈表時,我希望它成為我的首選。 最終,我想創建一個命名空間“樹”,並進一步擴展它。 我幾乎希望它像“字符串”抽象數據類型一樣易於使用。

簡短答案

不可能

長答案

我撒謊了 創建一個包含數據的嚴格條件,然后創建繼承數據的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字節)內存。 您可以使用struct A保存它,但是struct A有效地還有一個函數ptr / address,這會占用空間。 但是,這可以由編譯器解決。 而且編寫更差的代碼需要更長的時間,並且總體效率會更差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM