Добавление и удаление элементов в списке и подсписке

Нужно реализовать функции, которые отвечают за добавление и удаление элементов в список и подсписок. Как я понимаю, у меня есть lsub.add, он же и отвечает за добавление, но при этом, при добавлении элемента в главный список должен создаватся и соответственно подсписок А при удалении элемента из главного списка должен удалятся и связанный с ним подсписок

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
template<typename T>
class sublist {
    struct node {
        T     val;
        node* lst;
        node* next;
    };
private:
    node* lst;
public:
    sublist(void) :lst(NULL) {}
    ~sublist() {
        this->clear();
    }
 
    typedef node item;
    sublist(const sublist&);
    sublist& operator = (const sublist&);
public:
    //добавление корневого элемента
    item* add(const T& val) {
        item* p = new (nothrow) item();
        if (p == NULL)
            return NULL;
 
        p->lst = NULL;
        p->val = val;
        p->next = lst;
        lst = p;
        return p;
    }
 
    //добавление элемента к родителю
    item* add(item*& parent, const T& val) {
        if (parent == NULL)
            return NULL;
 
        item* p = new (nothrow) item();
        if (p != NULL) {
            p->val = val;
            p->lst = NULL;
            p->next = parent->lst;
            parent->lst = p;
        }
        return p;
    }
 
    //удаление всех элементов
    void clear(void) {
        if (lst != NULL)
            __clear(lst);
        lst = NULL;
    }
 
    //печать
    void print(ostream& _out, const item* p) {
        if (lst != NULL)
            __print(_out, lst, 0);
    }
 
    item* begin(void) const {
        return lst;
    }
    item* begin(void) {
        return lst;
    }
 
private:
 
    void __clear(item* p) {
        item* t;
        while (p != NULL) {
            if (p->lst != NULL)
                __clear(p->lst);
            t = p;
            p = p->next;
            delete t;
        }
    }
 
    //иерархическая печать
    void __print(ostream& _out, const item* p, int n) {
        while (p != NULL) {
            for (int i = 0; i < n; ++i)
                _out << '\t';
            _out << p->val << endl;
 
            if (p->lst != NULL)
                __print(_out, p->lst, n + 1);
            p = p->next;
        }
    }
};
 
 
int main(void) {
    typedef sublist<string> lstr;
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    lstr lsub;
    lstr::item* p, * s, * s1;
 
    p = lsub.add("Маршруты");
    s = lsub.add(p, "011");
    lsub.add(s, "Киев - Варшава");
    s = lsub.add(p, "012");
    lsub.add(s, "Париж - Берлин");
    s = lsub.add(p, "010");
    lsub.add(s, "Прага - Рим");
 
    lsub.print(cout, lsub.begin());
    lsub.clear();
 
    return 0;
}

Ответы (0 шт):