#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;
}