#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
Node* prev; //
Node(int d = 0, Node* p = 0, Node* n = 0) : data(d), next(p), prev(n) {} //
Node* insert_after(int value);
Node* delete_();
void display_list_after();
void display_list_prev();
};
Node* Node::insert_after(int value) {
Node *p = new Node(value);
Node *n = p; //
p->next = next;
p->prev = this; //
next = p;
return p;
}
Node* Node::delete_(){ //
Node *p = this;
Node *n = 0;
if (prev != 0){ //
prev->next = next; //
n = prev; //
}
if (next != 0) { //
next = prev->prev; //
if (n == 0){ //
n = next; //
}
}
delete p;
return n; //
}
void Node::display_list_after() {
Node *head = this;
while (head != 0) {
cout << head->data << " ";
head = head->next;
}
cout << '\n';
}
void Node::display_list_prev() {
Node *tail = this; //
while (tail != 0) { //
cout << tail->data << " "; //
tail = tail->prev; //
}
cout << '\n'; //
}
int main(){
Node *head = new Node(10);
Node *tail = NULL;
Node *p = head->insert_after(20);
p = p->insert_after(25);
p = p->insert_after(30);
p = p->insert_after(35);
tail = p->insert_after(40);
head->display_list_after();
tail->display_list_prev(); //
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKc3RydWN0IE5vZGUgewoJaW50IGRhdGE7CglOb2RlKiBuZXh0OwoJTm9kZSogcHJldjsgLy8KCU5vZGUoaW50IGQgPSAwLCBOb2RlKiBwID0gMCwgTm9kZSogbiA9IDApIDogZGF0YShkKSwgbmV4dChwKSwgcHJldihuKSB7fSAvLwoJTm9kZSogaW5zZXJ0X2FmdGVyKGludCB2YWx1ZSk7CglOb2RlKiBkZWxldGVfKCk7Cgl2b2lkIGRpc3BsYXlfbGlzdF9hZnRlcigpOwoJdm9pZCBkaXNwbGF5X2xpc3RfcHJldigpOwp9OwoKTm9kZSogTm9kZTo6aW5zZXJ0X2FmdGVyKGludCB2YWx1ZSkgewoJTm9kZSAqcCA9IG5ldyBOb2RlKHZhbHVlKTsKCU5vZGUgKm4gPSBwOyAvLwoJcC0+bmV4dCA9IG5leHQ7CglwLT5wcmV2ID0gdGhpczsgLy8KCW5leHQgPSBwOwoJcmV0dXJuIHA7Cn0KTm9kZSogTm9kZTo6ZGVsZXRlXygpeyAvLwoJTm9kZSAqcCA9IHRoaXM7CglOb2RlICpuID0gMDsKCWlmIChwcmV2ICE9IDApeyAvLwoJCXByZXYtPm5leHQgPSBuZXh0OyAvLwoJCW4gPSBwcmV2OyAvLwoJfQoKCWlmIChuZXh0ICE9IDApIHsgLy8KCQluZXh0ID0gcHJldi0+cHJldjsgLy8KCgkJaWYgKG4gPT0gMCl7IC8vCgkJCW4gPSBuZXh0OyAvLwoJCX0KCX0KCWRlbGV0ZSBwOwoJcmV0dXJuIG47IC8vCn0Kdm9pZCBOb2RlOjpkaXNwbGF5X2xpc3RfYWZ0ZXIoKSB7CglOb2RlICpoZWFkID0gdGhpczsKCXdoaWxlIChoZWFkICE9IDApIHsKCQljb3V0IDw8IGhlYWQtPmRhdGEgPDwgIiAiOwoJCWhlYWQgPSBoZWFkLT5uZXh0OwoJfQoJY291dCA8PCAnXG4nOwp9Cgp2b2lkIE5vZGU6OmRpc3BsYXlfbGlzdF9wcmV2KCkgewoJTm9kZSAqdGFpbCA9IHRoaXM7IC8vCgl3aGlsZSAodGFpbCAhPSAwKSB7IC8vCgkJY291dCA8PCB0YWlsLT5kYXRhIDw8ICIgIjsgLy8KCQl0YWlsID0gdGFpbC0+cHJldjsgLy8KCX0KCWNvdXQgPDwgJ1xuJzsgLy8KCn0KaW50IG1haW4oKXsKCU5vZGUgKmhlYWQgPSBuZXcgTm9kZSgxMCk7CglOb2RlICp0YWlsID0gTlVMTDsKCU5vZGUgKnAgPSBoZWFkLT5pbnNlcnRfYWZ0ZXIoMjApOwoJcCA9IHAtPmluc2VydF9hZnRlcigyNSk7CglwID0gcC0+aW5zZXJ0X2FmdGVyKDMwKTsKCXAgPSBwLT5pbnNlcnRfYWZ0ZXIoMzUpOwoJdGFpbCA9IHAtPmluc2VydF9hZnRlcig0MCk7CgloZWFkLT5kaXNwbGF5X2xpc3RfYWZ0ZXIoKTsKCXRhaWwtPmRpc3BsYXlfbGlzdF9wcmV2KCk7IC8vCglyZXR1cm4gMDsKfQ==