#include <iostream>
#include <string>
#include <stdexcept>
#include <initializer_list> // C++11 and later only
template <typename E>
class SLinkedList {
public:
SLinkedList();
SLinkedList(const E *vals, int num_vals);
SLinkedList(std::initializer_list<E> vals); // C++11 and later only
~SLinkedList();
bool empty() const;
int size() const;
E& front();
void addFront(const E &e);
void removeFront();
void printList() const;
private:
class SNode
{
public:
E elem;
SNode *next;
SNode(const E &e, SNode *n = NULL);
};
SNode* head;
int n; // number of items
};
template <typename E>
SLinkedList<E>::SNode::SNode(const E &e, SLinkedList<E>::SNode *n)
: elem(e), next(n) { }
template <typename E>
SLinkedList<E>::SLinkedList()
: head(NULL), n(0) { }
template <typename E>
SLinkedList<E>::SLinkedList(const E *vals, int num_vals)
: head(NULL), n(0)
{
for (int i = num_vals-1; i >= 0; --i)
addFront(vals[i]);
/* alternatively:
SNode **ptr = &head;
for (int i = 0; i < num_vals; ++i)
{
*ptr = new SNode(vals[i]);
++n;
ptr = &((*ptr)->next);
}
*/
}
template <typename E>
SLinkedList<E>::SLinkedList(std::initializer_list<E> vals)
: head(NULL), n(0)
{
const E *begin = vals.begin(), *iter = vals.end();
while (iter != begin)
addFront(*(--iter));
/* alternatively:
const E *iter = vals.begin(), *end = vals.end();
SNode **ptr = &head;
while (iter != end)
{
*ptr = new SNode(*iter);
++n;
ptr = &((*ptr)->next);
}
*/
}
template <typename E>
SLinkedList<E>::~SLinkedList()
{
while (head)
removeFront();
}
template <typename E>
bool SLinkedList<E>::empty() const
{
return (!head);
}
template <typename E>
int SLinkedList<E>::size() const
{
return n;
}
template <typename E>
E& SLinkedList<E>::front()
{
if (!head) throw std::length_error("empty list");
return head->elem;
}
template<typename E>
void SLinkedList<E>::printList() const
{
SNode *p = head;
while (p)
{
std::cout << p->elem << " ";
p = p->next;
}
std::cout << std::endl;
}
template <typename E>
void SLinkedList<E>::addFront(const E& e)
{
head = new SNode(e, head);
++n;
}
template <typename E>
void SLinkedList<E>::removeFront()
{
SNode* old = head;
if (!old) throw std::length_error("empty list");
head = old->next;
--n;
delete old;
}
int main() {
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
SLinkedList<int> list1(a, 10);
list1.printList();
SLinkedList<int> list2({0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
list2.printList();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3RkZXhjZXB0PgojaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4gLy8gQysrMTEgYW5kIGxhdGVyIG9ubHkKCnRlbXBsYXRlIDx0eXBlbmFtZSBFPgpjbGFzcyBTTGlua2VkTGlzdCB7CnB1YmxpYzoKICAgIFNMaW5rZWRMaXN0KCk7CiAgICBTTGlua2VkTGlzdChjb25zdCBFICp2YWxzLCBpbnQgbnVtX3ZhbHMpOwogICAgU0xpbmtlZExpc3Qoc3RkOjppbml0aWFsaXplcl9saXN0PEU+IHZhbHMpOyAvLyBDKysxMSBhbmQgbGF0ZXIgb25seQoKICAgIH5TTGlua2VkTGlzdCgpOwoKICAgIGJvb2wgZW1wdHkoKSBjb25zdDsKICAgIGludCBzaXplKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgIAoKICAgIEUmIGZyb250KCk7CgogICAgdm9pZCBhZGRGcm9udChjb25zdCBFICZlKTsKICAgIHZvaWQgcmVtb3ZlRnJvbnQoKTsKCiAgICB2b2lkIHByaW50TGlzdCgpIGNvbnN0OwoKcHJpdmF0ZToKICAgIGNsYXNzIFNOb2RlCiAgICB7CiAgICBwdWJsaWM6CiAgICAgICAgRSBlbGVtOwogICAgICAgIFNOb2RlICpuZXh0OwogICAgICAgIFNOb2RlKGNvbnN0IEUgJmUsIFNOb2RlICpuID0gTlVMTCk7CiAgICB9OwoKICAgIFNOb2RlKiBoZWFkOyAgICAgICAgICAgICAKICAgIGludCBuOyAvLyBudW1iZXIgb2YgaXRlbXMKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBFPgpTTGlua2VkTGlzdDxFPjo6U05vZGU6OlNOb2RlKGNvbnN0IEUgJmUsIFNMaW5rZWRMaXN0PEU+OjpTTm9kZSAqbikKICAgIDogZWxlbShlKSwgbmV4dChuKSB7IH0KCnRlbXBsYXRlIDx0eXBlbmFtZSBFPgpTTGlua2VkTGlzdDxFPjo6U0xpbmtlZExpc3QoKQogICAgOiBoZWFkKE5VTEwpLCBuKDApIHsgfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEU+ClNMaW5rZWRMaXN0PEU+OjpTTGlua2VkTGlzdChjb25zdCBFICp2YWxzLCBpbnQgbnVtX3ZhbHMpCiAgICA6IGhlYWQoTlVMTCksIG4oMCkKewogICAgZm9yIChpbnQgaSA9IG51bV92YWxzLTE7IGkgPj0gMDsgLS1pKQogICAgICAgIGFkZEZyb250KHZhbHNbaV0pOwoKICAgIC8qIGFsdGVybmF0aXZlbHk6CiAgICBTTm9kZSAqKnB0ciA9ICZoZWFkOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fdmFsczsgKytpKQogICAgewogICAgICAgICpwdHIgPSBuZXcgU05vZGUodmFsc1tpXSk7CiAgICAgICAgKytuOwogICAgICAgIHB0ciA9ICYoKCpwdHIpLT5uZXh0KTsKICAgIH0KICAgICovCn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBFPgpTTGlua2VkTGlzdDxFPjo6U0xpbmtlZExpc3Qoc3RkOjppbml0aWFsaXplcl9saXN0PEU+IHZhbHMpCiAgICA6IGhlYWQoTlVMTCksIG4oMCkKewogICAgY29uc3QgRSAqYmVnaW4gPSB2YWxzLmJlZ2luKCksICppdGVyID0gdmFscy5lbmQoKTsKICAgIHdoaWxlIChpdGVyICE9IGJlZ2luKQogICAgICAgIGFkZEZyb250KCooLS1pdGVyKSk7CgogICAgLyogYWx0ZXJuYXRpdmVseToKICAgIGNvbnN0IEUgKml0ZXIgPSB2YWxzLmJlZ2luKCksICplbmQgPSB2YWxzLmVuZCgpOwogICAgU05vZGUgKipwdHIgPSAmaGVhZDsKICAgIHdoaWxlIChpdGVyICE9IGVuZCkKICAgIHsgICAgICAgIAogICAgICAgICpwdHIgPSBuZXcgU05vZGUoKml0ZXIpOwogICAgICAgICsrbjsKICAgICAgICBwdHIgPSAmKCgqcHRyKS0+bmV4dCk7CiAgICB9CiAgICAqLwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KU0xpbmtlZExpc3Q8RT46On5TTGlua2VkTGlzdCgpICAgICAgICAgIAp7CiAgICB3aGlsZSAoaGVhZCkKICAgICAgICByZW1vdmVGcm9udCgpOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KYm9vbCBTTGlua2VkTGlzdDxFPjo6ZW1wdHkoKSBjb25zdCAgICAgIAp7CiAgICByZXR1cm4gKCFoZWFkKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIEU+CmludCBTTGlua2VkTGlzdDxFPjo6c2l6ZSgpIGNvbnN0CnsKICAgIHJldHVybiBuOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4KRSYgU0xpbmtlZExpc3Q8RT46OmZyb250KCkgICAgICAKewogICAgaWYgKCFoZWFkKSB0aHJvdyBzdGQ6Omxlbmd0aF9lcnJvcigiZW1wdHkgbGlzdCIpOwogICAgcmV0dXJuIGhlYWQtPmVsZW07Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIEU+CnZvaWQgU0xpbmtlZExpc3Q8RT46OnByaW50TGlzdCgpIGNvbnN0CnsKICAgIFNOb2RlICpwID0gaGVhZDsKICAgIHdoaWxlIChwKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCBwLT5lbGVtIDw8ICIgIjsKICAgICAgICBwID0gcC0+bmV4dDsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBFPgp2b2lkIFNMaW5rZWRMaXN0PEU+OjphZGRGcm9udChjb25zdCBFJiBlKQp7CiAgICBoZWFkID0gbmV3IFNOb2RlKGUsIGhlYWQpOwogICAgKytuOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRT4Kdm9pZCBTTGlua2VkTGlzdDxFPjo6cmVtb3ZlRnJvbnQoKQp7CiAgICBTTm9kZSogb2xkID0gaGVhZDsgICAgICAgICAgIAogICAgaWYgKCFvbGQpIHRocm93IHN0ZDo6bGVuZ3RoX2Vycm9yKCJlbXB0eSBsaXN0Iik7CiAgICBoZWFkID0gb2xkLT5uZXh0OyAgICAgICAgICAgCiAgICAtLW47CiAgICBkZWxldGUgb2xkOyAgICAgICAgICAgICAKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgYVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9OwogICAgU0xpbmtlZExpc3Q8aW50PiBsaXN0MShhLCAxMCk7CiAgICBsaXN0MS5wcmludExpc3QoKTsKICAgIAogICAgU0xpbmtlZExpc3Q8aW50PiBsaXN0Mih7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOX0pOwogICAgbGlzdDIucHJpbnRMaXN0KCk7CgogICAgcmV0dXJuIDA7Cn0=