#include <iostream>
#include <cstring>
using std::cout;
using std::endl;
class Node {
int data;
Node* next;
public:
Node() { };
void SetData(int aData) { data = aData; };
void SetNext(Node* aNext) { next = aNext; };
int Data() { return data; };
Node* Next() { return next; };
};
class List {
Node *head;
public:
List() : head(NULL) { };
void Print();
void Append(int data);
void Delete(int data);
};
void List::Append(int data) {
// Create a new node
Node* newNode = new Node();
newNode->SetData(data);
newNode->SetNext(NULL);
// Create a temp pointer
Node *tmp = head;
if ( tmp ) {
if ( tmp->Data() > newNode->Data() ) {
newNode->SetNext(tmp);
head = newNode;
}
else {
// Nodes already present in the list
// Parse to end of list anytime the next data has lower value
while ( tmp->Next() && tmp->Next()->Data() <= newNode->Data() ) {
tmp = tmp->Next();
}
// Point the lower value node to the new node
Node* _next = tmp->Next();
tmp->SetNext(newNode);
newNode->SetNext(_next);
}
}
else {
// First node in the list
head = newNode;
}
}
void List::Print() {
// Temp pointer
Node *tmp = head;
// No nodes
if ( !tmp ) {
cout << "EMPTY" << endl;
return;
}
// One node in the list
if ( !tmp->Next() ) {
cout << tmp->Data();
cout << " --> ";
cout << "NULL" << endl;
}
else {
// Parse and print the list
do {
cout << tmp->Data();
cout << " --> ";
tmp = tmp->Next();
}
while ( tmp );
cout << "NULL" << endl;
}
}
int main() {
List l;
l.Append(15);
l.Append(40);
l.Append(7);
l.Print();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnVzaW5nIHN0ZDo6Y291dDsKdXNpbmcgc3RkOjplbmRsOwoKY2xhc3MgTm9kZSB7CgogICAgaW50IGRhdGE7CiAgICBOb2RlKiBuZXh0OwoKcHVibGljOgoKICAgIE5vZGUoKSB7IH07CiAgICB2b2lkIFNldERhdGEoaW50IGFEYXRhKSB7IGRhdGEgPSBhRGF0YTsgfTsKICAgIHZvaWQgU2V0TmV4dChOb2RlKiBhTmV4dCkgeyBuZXh0ID0gYU5leHQ7IH07CiAgICBpbnQgRGF0YSgpIHsgcmV0dXJuIGRhdGE7IH07CiAgICBOb2RlKiBOZXh0KCkgeyByZXR1cm4gbmV4dDsgfTsKfTsKCmNsYXNzIExpc3QgewoKICAgIE5vZGUgKmhlYWQ7CgpwdWJsaWM6CgogICAgTGlzdCgpIDogaGVhZChOVUxMKSB7IH07CiAgICB2b2lkIFByaW50KCk7CiAgICB2b2lkIEFwcGVuZChpbnQgZGF0YSk7CiAgICB2b2lkIERlbGV0ZShpbnQgZGF0YSk7Cn07Cgp2b2lkIExpc3Q6OkFwcGVuZChpbnQgZGF0YSkgewoKICAgIC8vIENyZWF0ZSBhIG5ldyBub2RlCiAgICBOb2RlKiBuZXdOb2RlID0gbmV3IE5vZGUoKTsKICAgIG5ld05vZGUtPlNldERhdGEoZGF0YSk7CiAgICBuZXdOb2RlLT5TZXROZXh0KE5VTEwpOwoKICAgIC8vIENyZWF0ZSBhIHRlbXAgcG9pbnRlcgogICAgTm9kZSAqdG1wID0gaGVhZDsKCiAgICBpZiAoIHRtcCApIHsKICAgICAgICBpZiAoIHRtcC0+RGF0YSgpID4gbmV3Tm9kZS0+RGF0YSgpICkgewogICAgICAgICAgbmV3Tm9kZS0+U2V0TmV4dCh0bXApOwogICAgICAgICAgaGVhZCA9IG5ld05vZGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgLy8gTm9kZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBsaXN0CiAgICAgICAgICAvLyBQYXJzZSB0byBlbmQgb2YgbGlzdCBhbnl0aW1lIHRoZSBuZXh0IGRhdGEgaGFzIGxvd2VyIHZhbHVlCiAgICAgICAgICB3aGlsZSAoIHRtcC0+TmV4dCgpICYmIHRtcC0+TmV4dCgpLT5EYXRhKCkgPD0gbmV3Tm9kZS0+RGF0YSgpICkgewogICAgICAgICAgICAgIHRtcCA9IHRtcC0+TmV4dCgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFBvaW50IHRoZSBsb3dlciB2YWx1ZSBub2RlIHRvIHRoZSBuZXcgbm9kZQogICAgICAgICAgTm9kZSogX25leHQgPSB0bXAtPk5leHQoKTsKICAgICAgICAgIHRtcC0+U2V0TmV4dChuZXdOb2RlKTsKICAgICAgICAgIG5ld05vZGUtPlNldE5leHQoX25leHQpOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBGaXJzdCBub2RlIGluIHRoZSBsaXN0CiAgICAgICAgaGVhZCA9IG5ld05vZGU7CiAgICB9Cn0KCnZvaWQgTGlzdDo6UHJpbnQoKSB7CgogICAgLy8gVGVtcCBwb2ludGVyCiAgICBOb2RlICp0bXAgPSBoZWFkOwoKICAgIC8vIE5vIG5vZGVzCiAgICBpZiAoICF0bXAgKSB7CiAgICAgICAgY291dCA8PCAiRU1QVFkiIDw8IGVuZGw7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIE9uZSBub2RlIGluIHRoZSBsaXN0CiAgICBpZiAoICF0bXAtPk5leHQoKSApIHsKICAgICAgICBjb3V0IDw8IHRtcC0+RGF0YSgpOwogICAgICAgIGNvdXQgPDwgIiAtLT4gIjsKICAgICAgICBjb3V0IDw8ICJOVUxMIiA8PCBlbmRsOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gUGFyc2UgYW5kIHByaW50IHRoZSBsaXN0CiAgICAgICAgZG8gewogICAgICAgICAgICBjb3V0IDw8IHRtcC0+RGF0YSgpOwogICAgICAgICAgICBjb3V0IDw8ICIgLS0+ICI7CiAgICAgICAgICAgIHRtcCA9IHRtcC0+TmV4dCgpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoIHRtcCApOwoKICAgICAgICBjb3V0IDw8ICJOVUxMIiA8PCBlbmRsOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIExpc3QgbDsKICAgIGwuQXBwZW5kKDE1KTsKICAgIGwuQXBwZW5kKDQwKTsKICAgIGwuQXBwZW5kKDcpOwogICAgbC5QcmludCgpOwogICAgcmV0dXJuIDA7Cn0=