//ali eldin mahmoud mohamed
#include <iostream>
#include <string>
using namespace std;
typedef int Data;
struct node{
node *prev;
Data ele;
node *next;
};
class DLL{
private:
int counter;
node *head;
node *tail;
public:
DLL(){
counter=0;
head=NULL;
tail=NULL;
}
void insert(Data x, node *p){
node *temp = new node;
temp->ele = x;
temp->prev = NULL;
temp->next = NULL;
if(head == NULL){
head = temp;
tail = temp;
counter++;
return;
}
if(p == NULL){
temp->prev = tail;
tail->next = temp;
tail = temp;
} else {
temp->prev = p->prev;
temp->next = p;
if(p->prev != NULL){
p->prev->next = temp;
} else {
head = temp;
}
p->prev = temp;
}
counter++;
}
void print(){
node *p=head;
while(p!=NULL){
cout<<p->ele<<"\t";
p=p->next;
}
cout << endl;
}
node * end(){
return tail;
}
node * first(){
return head;
}
int size(){
return counter;
}
node *next(node *p){
if(p==NULL)return NULL;
return p->next;
}
node *previous(node *p){
if(p==NULL)return NULL;
return p->prev;
}
node * locate(Data x){
node *p=head;
while(p!=NULL){
if(p->ele==x)
return p;
p=p->next;
}
cout<<"not found\n";
return end();
}
Data retrieve(node *p){
if(p==NULL){
cout<<"out of range\n";
return -1;
}
return p->ele;
}
void makeNull() {
while (head != NULL) {
node* temp = head;
head = head->next;
delete temp;
}
tail = NULL;
counter = 0;
}
void Delete(node *p){
if(p==NULL){
cout<<"out of range \n";
return;
}
node *temp=p;
if(p!=tail){
p->next->prev=p->prev;
}else{
tail=p->prev;
}
if(p!=head){
p->prev->next=p->next;
}else{
head=p->next;
}
delete temp;
counter--;
}
void insertFromBack(Data x){
insert(x,NULL);
}
};
void purge(DLL &l){
node *i=l.first();
node *j,*temp;
while(i!=NULL){
j=l.next(i);
while(j!=NULL){
if(l.retrieve(j)==l.retrieve(i)){
temp=j;
j=l.next(j);
l.Delete(temp);
}else{
j=l.next(j);
}
}
i=l.next(i);
}
}
void reverse(DLL &l){
DLL n;
node *i=l.first();
while(i!=NULL){
n.insert(l.retrieve(i), n.first());
i=l.next(i);
}
l=n;
}
int main(){
DLL l,n;
l.insert(1, l.first());
l.insert(2, l.first());
l.insert(3, l.first());
l.insert(4, l.first());
l.insert(5, l.first());
cout << "Before reverse: ";
l.print();
reverse(l);
cout << "After reverse: ";
l.print();
n.insertFromBack(2);
n.insertFromBack(2);
n.insertFromBack(2);
n.insertFromBack(3);
n.insertFromBack(5);
cout << "Before purge: ";
n.print();
purge(n);
cout << "After purge: ";
n.print();
n.Delete(n.locate(5));
n.print();
return 0;
}
Ly9hbGkgZWxkaW4gbWFobW91ZCBtb2hhbWVkIAojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgaW50IERhdGE7CnN0cnVjdCBub2RlewogICAgbm9kZSAqcHJldjsKICAgIERhdGEgZWxlOwogICAgbm9kZSAqbmV4dDsKfTsKCmNsYXNzIERMTHsKcHJpdmF0ZToKICAgIGludCBjb3VudGVyOwogICAgbm9kZSAqaGVhZDsKICAgIG5vZGUgKnRhaWw7CnB1YmxpYzoKICAgIERMTCgpewogICAgICAgIGNvdW50ZXI9MDsKICAgICAgICBoZWFkPU5VTEw7CiAgICAgICAgdGFpbD1OVUxMOwogICAgfQogICAgdm9pZCBpbnNlcnQoRGF0YSB4LCBub2RlICpwKXsKICAgICAgICBub2RlICp0ZW1wID0gbmV3IG5vZGU7CiAgICAgICAgdGVtcC0+ZWxlID0geDsKICAgICAgICB0ZW1wLT5wcmV2ID0gTlVMTDsKICAgICAgICB0ZW1wLT5uZXh0ID0gTlVMTDsKICAgICAgICAKICAgICAgICBpZihoZWFkID09IE5VTEwpewogICAgICAgICAgICBoZWFkID0gdGVtcDsKICAgICAgICAgICAgdGFpbCA9IHRlbXA7CiAgICAgICAgICAgIGNvdW50ZXIrKzsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihwID09IE5VTEwpewogICAgICAgICAgICB0ZW1wLT5wcmV2ID0gdGFpbDsKICAgICAgICAgICAgdGFpbC0+bmV4dCA9IHRlbXA7CiAgICAgICAgICAgIHRhaWwgPSB0ZW1wOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRlbXAtPnByZXYgPSBwLT5wcmV2OwogICAgICAgICAgICB0ZW1wLT5uZXh0ID0gcDsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmKHAtPnByZXYgIT0gTlVMTCl7CiAgICAgICAgICAgICAgICBwLT5wcmV2LT5uZXh0ID0gdGVtcDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhlYWQgPSB0ZW1wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHAtPnByZXYgPSB0ZW1wOwogICAgICAgIH0KICAgICAgICBjb3VudGVyKys7CiAgICB9CiAgICB2b2lkIHByaW50KCl7CiAgICAgICAgbm9kZSAqcD1oZWFkOwogICAgICAgIHdoaWxlKHAhPU5VTEwpewogICAgICAgICAgICBjb3V0PDxwLT5lbGU8PCJcdCI7CiAgICAgICAgICAgIHA9cC0+bmV4dDsKICAgICAgICB9CiAgICAgICAgY291dCA8PCBlbmRsOwogICAgfQogICAgbm9kZSAqIGVuZCgpewogICAgICAgIHJldHVybiB0YWlsOwogICAgfQogICAgbm9kZSAqIGZpcnN0KCl7CiAgICAgICAgcmV0dXJuIGhlYWQ7CiAgICB9CiAgICBpbnQgc2l6ZSgpewogICAgICAgIHJldHVybiBjb3VudGVyOwogICAgfQogICAgbm9kZSAqbmV4dChub2RlICpwKXsKICAgICAgICBpZihwPT1OVUxMKXJldHVybiBOVUxMOwogICAgICAgIHJldHVybiBwLT5uZXh0OwogICAgfQogICAgbm9kZSAqcHJldmlvdXMobm9kZSAqcCl7CiAgICAgICAgaWYocD09TlVMTClyZXR1cm4gTlVMTDsKICAgICAgICByZXR1cm4gcC0+cHJldjsKICAgIH0KICAgIG5vZGUgKiBsb2NhdGUoRGF0YSB4KXsKICAgICAgICBub2RlICpwPWhlYWQ7CiAgICAgICAgd2hpbGUocCE9TlVMTCl7CiAgICAgICAgICAgIGlmKHAtPmVsZT09eCkKICAgICAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgICAgICBwPXAtPm5leHQ7CiAgICAgICAgfQogICAgICAgIGNvdXQ8PCJub3QgZm91bmRcbiI7CiAgICAgICAgcmV0dXJuIGVuZCgpOwogICAgfQogICAgRGF0YSByZXRyaWV2ZShub2RlICpwKXsKICAgICAgICBpZihwPT1OVUxMKXsKICAgICAgICAgICAgY291dDw8Im91dCBvZiByYW5nZVxuIjsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcC0+ZWxlOwogICAgfQogICAgdm9pZCBtYWtlTnVsbCgpIHsKICAgICAgICB3aGlsZSAoaGVhZCAhPSBOVUxMKSB7CiAgICAgICAgICAgIG5vZGUqIHRlbXAgPSBoZWFkOwogICAgICAgICAgICBoZWFkID0gaGVhZC0+bmV4dDsKICAgICAgICAgICAgZGVsZXRlIHRlbXA7CiAgICAgICAgfQogICAgICAgIHRhaWwgPSBOVUxMOwogICAgICAgIGNvdW50ZXIgPSAwOwogICAgfQogICAgdm9pZCBEZWxldGUobm9kZSAqcCl7CiAgICAgICAgaWYocD09TlVMTCl7CiAgICAgICAgICAgIGNvdXQ8PCJvdXQgb2YgcmFuZ2UgXG4iOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIG5vZGUgKnRlbXA9cDsKICAgICAgICBpZihwIT10YWlsKXsKICAgICAgICAgICAgcC0+bmV4dC0+cHJldj1wLT5wcmV2OwogICAgICAgIH1lbHNlewogICAgICAgICAgICB0YWlsPXAtPnByZXY7CiAgICAgICAgfQogICAgICAgIGlmKHAhPWhlYWQpewogICAgICAgICAgICBwLT5wcmV2LT5uZXh0PXAtPm5leHQ7CiAgICAgICAgICAgIAogICAgICAgIH1lbHNlewogICAgICAgICAgICBoZWFkPXAtPm5leHQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRlbGV0ZSB0ZW1wOwogICAgICAgIGNvdW50ZXItLTsKICAgIH0KICAgIHZvaWQgaW5zZXJ0RnJvbUJhY2soRGF0YSB4KXsKICAgICAgICBpbnNlcnQoeCxOVUxMKTsKICAgIH0KfTsKdm9pZCBwdXJnZShETEwgJmwpewogICAgbm9kZSAqaT1sLmZpcnN0KCk7CiAgICBub2RlICpqLCp0ZW1wOwoKICAgIHdoaWxlKGkhPU5VTEwpewogICAgICAgIGo9bC5uZXh0KGkpOwogICAgICAgIHdoaWxlKGohPU5VTEwpewogICAgICAgICAgICBpZihsLnJldHJpZXZlKGopPT1sLnJldHJpZXZlKGkpKXsKICAgICAgICAgICAgICAgIHRlbXA9ajsKICAgICAgICAgICAgICAgIGo9bC5uZXh0KGopOwogICAgICAgICAgICAgICAgbC5EZWxldGUodGVtcCk7CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgaj1sLm5leHQoaik7CiAgICAgICAgICAgIH0gCiAgICAgICAgfQogICAgICAgIGk9bC5uZXh0KGkpOwogICAgfQp9CnZvaWQgcmV2ZXJzZShETEwgJmwpewogICAgRExMIG47CiAgICBub2RlICppPWwuZmlyc3QoKTsKICAgIHdoaWxlKGkhPU5VTEwpewogICAgICAgIG4uaW5zZXJ0KGwucmV0cmlldmUoaSksIG4uZmlyc3QoKSk7CiAgICAgICAgaT1sLm5leHQoaSk7CiAgICB9CiAgICBsPW47Cn0KaW50IG1haW4oKXsKICAgIERMTCBsLG47CiAgICAKICAgIGwuaW5zZXJ0KDEsIGwuZmlyc3QoKSk7CiAgICBsLmluc2VydCgyLCBsLmZpcnN0KCkpOwogICAgbC5pbnNlcnQoMywgbC5maXJzdCgpKTsKICAgIGwuaW5zZXJ0KDQsIGwuZmlyc3QoKSk7CiAgICBsLmluc2VydCg1LCBsLmZpcnN0KCkpOwogICAgY291dCA8PCAiQmVmb3JlIHJldmVyc2U6ICI7CiAgICBsLnByaW50KCk7CiAgICByZXZlcnNlKGwpOwogICAgY291dCA8PCAiQWZ0ZXIgcmV2ZXJzZTogIjsKICAgIGwucHJpbnQoKTsKCiAgICBuLmluc2VydEZyb21CYWNrKDIpOwogICAgbi5pbnNlcnRGcm9tQmFjaygyKTsKICAgIG4uaW5zZXJ0RnJvbUJhY2soMik7CiAgICBuLmluc2VydEZyb21CYWNrKDMpOwogICAgbi5pbnNlcnRGcm9tQmFjayg1KTsKCiAgICBjb3V0IDw8ICJCZWZvcmUgcHVyZ2U6ICI7CiAgICBuLnByaW50KCk7ICAKICAgIHB1cmdlKG4pOwogICAgY291dCA8PCAiQWZ0ZXIgcHVyZ2U6ICI7CiAgICBuLnByaW50KCk7ICAKICAgIAogICAgbi5EZWxldGUobi5sb2NhdGUoNSkpOwogICAgbi5wcmludCgpOyAKICAgIHJldHVybiAwOwp9Cg==