#include <iostream> 
using namespace std;
#define ElemType int
#define maxSize 100
typedef struct dNode {
    ElemType data;
    struct dNode *next, *prior;
}dNode, *doubleLinkList;
bool initDoubleLinkList(doubleLinkList &L) {
    L = new dNode;
    L->next = NULL;
    L->prior = NULL;
}
void inputDoubleLinkListHead(doubleLinkList &L) {
    ElemType data;
    cin >> data;
    while(data != -1) {
        dNode *newp;
        newp = new dNode;
        newp->data = data;
        newp->next = L->next;
        newp->prior = L;
        L->next = newp;
        cin >> data;
    }
}
void inputDoubleLinkListTail(doubleLinkList &L) {
    dNode *tail = L;
    ElemType data;
    cin >> data;
    while(data != -1) {
        dNode *p;
        p = new dNode;
        p->data = data;
        p->prior = tail;
        tail->next = p;
        tail = p;
        cin >> data;
    }
    tail->next = NULL;
}
int getLengthDoubleLinkList(doubleLinkList L) {
    int res = 0;
    dNode *p;
    p = L->next;
    while(p != NULL) {
        res ++;
        p = p->next;
    }
    return res;
}
void outputDoubleLinkList(doubleLinkList L) {
    dNode *p;
    p = L->next;
    while(p) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}
bool insertDoubleLinkListBefore(doubleLinkList &L, ElemType e, int i) {
    if(i > getLengthDoubleLinkList(L)) return false;
    else {
        dNode *p;
        p = L;
        while(i --) {
            p = p->next;
        }
        dNode *newp = new dNode;
        newp->data = e;
        newp->prior = p->prior;
        newp->next = p;
        p->prior->next = newp;
        p->prior = newp;
        return true;
    }
}
bool insertDoubleLinkListAfter(doubleLinkList &L, ElemType e, int i) {
    if(i > getLengthDoubleLinkList(L)) return false;
    else {
        dNode *p;
        p = L;
        i ++;
        while(i --) {
            p = p->next;
        }
        dNode *newp = new dNode;
        newp->data = e;
        newp->prior = p->prior;
        newp->next = p;
        p->prior->next = newp;
        p->prior = newp;
        return true;
    }
}
int searchDoubleLinkList(doubleLinkList L, ElemType e) {
    dNode *p;
    p = L->next;
    int res = 1;
    while(p) {
        if(p->data == e) break;
        p = p->next;
        res ++;
    }
    if(p != NULL) {
        return res;
    }
    else return -1;
}
bool deleteDoubleLinkListIndex_i(doubleLinkList &L, int i) {
    if(i > getLengthDoubleLinkList(L)) return false;
    else {
        dNode *p;
        p = L;
        while(i --) {
            p = p->next;
        }
        dNode *pprior, *pnext;
        pprior = p->prior;
        pnext = p->next;
        pprior->next = pnext;
        pnext->prior = pprior;
        delete p;
        return true;
    }
}
bool deleteDoubleLinkListValue_e(doubleLinkList &L, ElemType e) {
    int i = searchDoubleLinkList(L, e);
    deleteDoubleLinkListIndex_i(L, i);
}
int main() {
    doubleLinkList L;
    initDoubleLinkList(L);
    inputDoubleLinkListTail(L);
    outputDoubleLinkList(L);
    
    
    insertDoubleLinkListBefore(L, 15, 4);
    outputDoubleLinkList(L);
    int res = searchDoubleLinkList(L, 15);
    cout << res << endl;
    deleteDoubleLinkListIndex_i(L, 3);
    outputDoubleLinkList(L);
    return 0;
}