#include <iostream>
template<typename T>
class slist {
struct node {
node* next;
T val;
};
private:
node* lst;
public:
slist(void):lst(NULL){}
~slist(){
this->clear();
}
public:
slist& operator + (const T& val){
node* p = new (std::nothrow) node();
if(p != NULL){
p->val = val;
p->next = lst;
lst = p;
}
return *this;
}
slist& operator -- (void){
node* t;
if(lst != NULL){
t = lst;
lst = lst->next;
delete t;
}
return *this;
}
void clear(void){
node* t;
while(lst != NULL){
t = lst;
lst = lst->next;
delete t;
}
}
T& operator *(void) const { return lst->val; }
T& operator *(void) { return lst->val; }
bool empty(void) const { return (lst == NULL); }
};
int main(void){
slist<char> lc;
for(char c = 'A'; c <= 'Z'; ++c)
lc = lc + c;
while(! lc.empty()){
std::cout << *lc;
--lc;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIHNsaXN0IHsKCXN0cnVjdCBub2RlIHsKCQlub2RlKiBuZXh0OwoJCVQgICAgIHZhbDsKCX07CnByaXZhdGU6Cglub2RlKiBsc3Q7CnB1YmxpYzoKCXNsaXN0KHZvaWQpOmxzdChOVUxMKXt9Cgl+c2xpc3QoKXsKCQl0aGlzLT5jbGVhcigpOwoJfQpwdWJsaWM6CgkKCXNsaXN0JiBvcGVyYXRvciArIChjb25zdCBUJiB2YWwpewoJCW5vZGUqIHAgPSBuZXcgKHN0ZDo6bm90aHJvdykgbm9kZSgpOwoJCWlmKHAgIT0gTlVMTCl7CgkJCXAtPnZhbCAgPSB2YWw7CgkJCXAtPm5leHQgPSBsc3Q7CgkJCWxzdCA9IHA7CgkJfQoJCXJldHVybiAqdGhpczsKCX0KCglzbGlzdCYgb3BlcmF0b3IgLS0gKHZvaWQpewoJCW5vZGUqIHQ7CgkJaWYobHN0ICE9IE5VTEwpewoJCQl0ICAgPSBsc3Q7CgkJCWxzdCA9IGxzdC0+bmV4dDsKCQkJZGVsZXRlIHQ7CgkJfQoJCXJldHVybiAqdGhpczsKCX0KCgl2b2lkIGNsZWFyKHZvaWQpewoJCW5vZGUqIHQ7CgkJd2hpbGUobHN0ICE9IE5VTEwpewoJCQl0ICAgPSBsc3Q7CgkJCWxzdCA9IGxzdC0+bmV4dDsKCQkJZGVsZXRlIHQ7CgkJfQoJfQoKCVQmIG9wZXJhdG9yICoodm9pZCkgY29uc3QgeyByZXR1cm4gbHN0LT52YWw7IH0KCVQmIG9wZXJhdG9yICoodm9pZCkgeyByZXR1cm4gbHN0LT52YWw7IH0KCglib29sIGVtcHR5KHZvaWQpIGNvbnN0IHsgcmV0dXJuIChsc3QgPT0gTlVMTCk7IH0KfTsKCgppbnQgbWFpbih2b2lkKXsKCXNsaXN0PGNoYXI+IGxjOwoJZm9yKGNoYXIgYyA9ICdBJzsgYyA8PSAnWic7ICsrYykKCQlsYyA9IGxjICsgYzsKCgl3aGlsZSghIGxjLmVtcHR5KCkpewoJCXN0ZDo6Y291dCA8PCAqbGM7CgkJLS1sYzsKCX0KCXJldHVybiAwOwp9