#include <iostream>
#include <cstdlib>
using namespace std;
struct node
{
int data;
struct node* next;
};
void push(struct node** head_ref, int new_val)
{
struct node* new_node = (struct node*)malloc(sizeof(struct node));
new_node->data = new_val;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
void print_list(struct node* head)
{
while(head!=NULL)
{
cout<< head->data <<"->";
head = head->next;
}
cout<<"NULL";
cout<<endl;
}
void remove_lower(struct node** head_ref)
{
struct node* current = (*head_ref);
if(current == NULL || current->next == NULL)
return ;
struct node* prev = NULL, *next = NULL, *temp = NULL;
while(current->next != NULL)
{
next = current->next;
temp = next;
/*
* check if there is any element greater than current
* in the remaining list.
*/
while(temp->next != NULL) {
if (temp->data > current->data) {
/*
* if some element is greater than current, then
* delete current element.
*/
free(current);
current = NULL;
if (prev == NULL) {
/* it was the first element, need to update the head */
*head_ref = next;
} else {
/* not first element - update "prev->next" pointer */
prev->next = next;
}
break;
}
temp = temp->next;
}
/* if current element was not deleted - update "prev" pointer */
if (current != NULL) {
prev = current;
}
current = next;
}
}
int main()
{
struct node* head = NULL;
for(int i = 0; i <= 7; i++)
{
push(&head,i);
if(i%2==0)
push(&head,i*i);
push(&head,i-5);
}
print_list(head);
remove_lower(&head);
print_list(head);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCnN0cnVjdCBub2RlCnsKICBpbnQgZGF0YTsKICBzdHJ1Y3Qgbm9kZSogbmV4dDsKfTsKIAp2b2lkIHB1c2goc3RydWN0IG5vZGUqKiBoZWFkX3JlZiwgaW50IG5ld192YWwpCnsKICBzdHJ1Y3Qgbm9kZSogbmV3X25vZGUgPSAoc3RydWN0IG5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IG5vZGUpKTsKICBuZXdfbm9kZS0+ZGF0YSA9IG5ld192YWw7CiAgbmV3X25vZGUtPm5leHQgPSAoKmhlYWRfcmVmKTsKICAoKmhlYWRfcmVmKSA9IG5ld19ub2RlOwp9CiAKdm9pZCBwcmludF9saXN0KHN0cnVjdCBub2RlKiBoZWFkKQp7CiAgd2hpbGUoaGVhZCE9TlVMTCkKICAgIHsKICAgICAgY291dDw8IGhlYWQtPmRhdGEgPDwiLT4iOwogICAgICBoZWFkID0gaGVhZC0+bmV4dDsKICAgIH0KICBjb3V0PDwiTlVMTCI7CiAgY291dDw8ZW5kbDsKfQogCnZvaWQgcmVtb3ZlX2xvd2VyKHN0cnVjdCBub2RlKiogaGVhZF9yZWYpCnsKICBzdHJ1Y3Qgbm9kZSogY3VycmVudCA9ICgqaGVhZF9yZWYpOwogIGlmKGN1cnJlbnQgPT0gTlVMTCB8fCBjdXJyZW50LT5uZXh0ID09IE5VTEwpCiAgICByZXR1cm4gOwogICAgCiAgc3RydWN0IG5vZGUqIHByZXYgPSBOVUxMLCAqbmV4dCA9IE5VTEwsICp0ZW1wID0gTlVMTDsKICB3aGlsZShjdXJyZW50LT5uZXh0ICE9IE5VTEwpCiAgewogIAluZXh0ID0gY3VycmVudC0+bmV4dDsKICAJdGVtcCA9IG5leHQ7CiAgCS8qCiAgCSAqIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBlbGVtZW50IGdyZWF0ZXIgdGhhbiBjdXJyZW50IAogIAkgKiBpbiB0aGUgcmVtYWluaW5nIGxpc3QuCiAgCSAqLwogIAkgCiAgCXdoaWxlKHRlbXAtPm5leHQgIT0gTlVMTCkgewogIAkJaWYgKHRlbXAtPmRhdGEgPiBjdXJyZW50LT5kYXRhKSB7CiAgCQkJLyogCiAgCQkJICogaWYgc29tZSBlbGVtZW50IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50LCB0aGVuCiAgCQkJICogZGVsZXRlIGN1cnJlbnQgZWxlbWVudC4KICAJCQkgKi8KICAJCQlmcmVlKGN1cnJlbnQpOwogIAkJCWN1cnJlbnQgPSBOVUxMOwogIAkJCWlmIChwcmV2ID09IE5VTEwpIHsKICAJCQkJLyogaXQgd2FzIHRoZSBmaXJzdCBlbGVtZW50LCBuZWVkIHRvIHVwZGF0ZSB0aGUgaGVhZCAqLwogIAkJCQkqaGVhZF9yZWYgPSBuZXh0OwogIAkJCX0gZWxzZSB7CiAgCQkJCS8qIG5vdCBmaXJzdCBlbGVtZW50IC0gdXBkYXRlICJwcmV2LT5uZXh0IiBwb2ludGVyICovCiAgCQkJCXByZXYtPm5leHQgPSBuZXh0OwogIAkJCX0KICAJCQlicmVhazsKICAJCX0KICAJCXRlbXAgPSB0ZW1wLT5uZXh0OwogIAl9CiAgCS8qIGlmIGN1cnJlbnQgZWxlbWVudCB3YXMgbm90IGRlbGV0ZWQgLSB1cGRhdGUgInByZXYiIHBvaW50ZXIgKi8KICAJaWYgKGN1cnJlbnQgIT0gTlVMTCkgewogIAkJcHJldiA9IGN1cnJlbnQ7CiAgCX0KICAJY3VycmVudCA9IG5leHQ7CiAgfQp9CiAKaW50IG1haW4oKQp7CiAgc3RydWN0IG5vZGUqIGhlYWQgPSBOVUxMOwogIGZvcihpbnQgaSA9IDA7IGkgPD0gNzsgaSsrKQogICAgewogICAgICBwdXNoKCZoZWFkLGkpOwogICAgICBpZihpJTI9PTApCiAgICAgIAlwdXNoKCZoZWFkLGkqaSk7CiAgICAgIHB1c2goJmhlYWQsaS01KTsKICAgIH0KICBwcmludF9saXN0KGhlYWQpOwogIHJlbW92ZV9sb3dlcigmaGVhZCk7CiAgcHJpbnRfbGlzdChoZWFkKTsKICByZXR1cm4gMDsKfQ==