Thanks for the detailed replies, will take some time to read up, absorb and apply changes:
Implementing suggested code changes 1:
structs are now classes & made friends, no change to main, but getting errors:

I want to know why friends is not working, ....but, also wondering if using class get functions to retrieve private class data might not be simpler/tidier?
Maybe I'm doing it wrong, but:
virtual ~List() {
while (begins->next != begins) {
begins->prev = begins->next;
begins->next = begins->next->next;
delete begins->prev;
}
delete begins;
}
Will begins->next ever == begins ? ..at any rate it throws an access violation error when reading location.
Maybe you meant something like?
virtual ~List() {
while (begins->next != ends) {
begins->prev = begins->next;
begins->next = begins->next->next;
delete begins->prev;
}
delete begins;
delete ends;
}