Добавление и удаление элементов в списке и подсписке
Нужно реализовать функции, которые отвечают за добавление и удаление элементов в список и подсписок. Как я понимаю, у меня есть 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;
}