#include<iostream>
/*
双链表
*/
typedef int Elemtype;
typedef struct DNode{
Elemtype data; //数据域
DNode *pre; //前驱
DNode *next; //后继
}DNode,*DLinkList;
//头插法创建双链表
DLinkList createHeadDList() {
DLinkList L = (DLinkList)malloc(sizeof(DNode));
Elemtype e;
L->next = NULL;
L->pre = NULL;
scanf("%d", &e);
while (e != 999) {
DNode *s = (DNode*)malloc(sizeof(DNode));
s->data = e;
s->next = L->next;
if (L->next)
L->next->pre = s; //插入第一个结点时不需要这个操作
s->pre = L;
L->next = s;
scanf("%d", &e);
}
return L;
}
//尾插法创建双链表
DLinkList createFootDList() {
DLinkList L = (DLinkList)malloc(sizeof(DNode));
Elemtype e;
DNode *s,*r = L;
L->pre = NULL;
scanf("%d", &e);
while (e != 999) {
s = (DNode*)malloc(sizeof(DNode));
s->data = e;
r->next = s;
s->pre = r;
r = s;
scanf("%d", &e);
}
r->next = NULL;
return L;
}
//按序号查找结点
DNode * getElem(DLinkList L, int i) {
if (i < 0) return false;
if (i == 0) return L;
int j = 1;
DNode *p = (DNode*)malloc(sizeof(DNode));
p = L->next;
while (p&&j < i) {
p = p->next;
j++;
}
return p;
}
//插入
bool insDlist(DLinkList &L, int i, Elemtype e) {
if (i <= 0) return false;
DNode *p = getElem(L, i - 1);
if(p) {
DNode *q = (DNode*)malloc(sizeof(DNode));
q->data = e;
p->next->pre = q;
q->pre = q;
q->next = p->next;
p->next = q;
return true;
}
else
return false;
}
//删除
bool delDlist(DLinkList &L, int i) {
if (i <= 0) return false;
DNode *p = getElem(L, i - 1);
DNode *s = p->next;
if (p&&s) { //p和s都存在
p->next = s->next; //如果s为最后一个元素,p的后继指针指向空
if (s->next) //如果s后面还有元素
s->next->pre = p;
free(s);
return true;
}else
return false;
}
//打印链表
void printList(DLinkList L) {
DNode *p = L->next;
while (p) {
printf("%4d", p->data);
p = p->next;
}
printf("\n");
}
int main() {
//3 4 5 6 7 8 999
//DLinkList L = createHeadDList();
DLinkList L = createFootDList();
if (insDlist(L, 3, 66)) {
printList(L);
printf("%d\n", getElem(L, 2)->data);
}
if (delDlist(L, 3))
printList(L);
system("pause");
}