双链表的结构体定义
typedef struct DLNode{
int data;
struct DLNode* prior;//指向前驱结点的指针
struct DLNode* next;//指向后继结点的指针
}DLNode;
采用尾插法建立双链表
void CreateDlistR(DLNode *&L,int n) {
DLNode* s, * r;
int i;
L = new DLNode;
L->prior = NULL;
L->next = NULL;
r = L; //和单链表一样,r始终指向链表的终端结点,刚开始头结点也是终端结点
for (i = 0; i < n; i++) {
s = new DLNode; //创建新结点
cin >> s->data;
//下面三句将s插入到L的尾部,并且r指向s,s->prior=r;这一句是与建立单链表不同的地方
r->next = s;
s->prior = r;
r = s;
}
r->next = NULL;
}
查找结点
在双链表中查找一个值为x的结点,从第一个结点开始,边扫描边比较,若找到这样的结点,则返回结点的指针,否则返回NULL.
DLNode* findNode(DLNode* L, int x) {
DLNode* p = L->next; //一开始让p指向L链表的开始结点
while (p != NULL) {
if (p->data == x)
break;
p = p->next;
}
return p;//如果找到,则p中内容是结点地址;如果没找到,则p是NULL,
}
插入结点
假设在双链表中p所指的结点之后插入一个结点s
void insertNode(DLNode *&L,int i,int j) {
DLNode* p = L->next;
DLNode* s;
while (p != NULL) {//这个循环框架其实就是查找操作的框架
if (p->data == i) {
s = new DLNode;
s->data = j;
//核心语句就是下面这四句
s->next = p->next;
s->prior = p;
p->next = s;
s->next->prior = s;//如若是插入最后一个元素的后面,则把这行去掉
break;
}
p = p->next;
}
}
不太好理解的话,看下我画的图
删除结点
假设删除双链表中p结点的后继结点
void DeleteNode(DLNode*& L, int i) {
DLNode* p = L->next;
DLNode* q;
while (p != NULL) {
if (p->data == i) {
q = p->next; //让q指针指向p->next也就是我们要删除的结点
p->next = q->next; //让p->next指针指向了要删除的元素的下一个元素的地址
q->next->prior = p; //让要删除的元素的下一个元素的prior的指针指向p结点
delete q;
}
p = p->next;
}
}