链表有单向链表也有双向链表,双向链表既可以下一个,也可以上一个。
双向链表在一个节点里至少有三个域,左链域(llink),右链域(rlink),数据域(data)
双向链表也可以做成循环链表,可以有表头结构。
今天我们做一个双向链表,但是不是循环链表:
#include<iostream>
using namespace std;
class DblList;//
class DblListNode{
friend class DblList;
public:
int data;
DblListNode *llink, *rlink;
};
class DblList{
public:
DblList(){
first = new DblListNode();
first->llink = first->rlink = first;
}
void Insert(DblListNode*, DblListNode*);
void Delete(DblListNode*);
DblListNode *first;
};
//p是新的节点,插入到x的右边
void DblList::Insert(DblListNode *p, DblListNode*x){
p->llink = x;
p->rlink = x->rlink;
x->rlink->llink = p;
x->rlink = p;
}
void DblList::Delete(DblListNode *x){
if (x == first)
cout << "Deletion of head node not permitted." << endl;
else{
x->llink->rlink = x->rlink;
x->rlink->llink = x->llink;
delete x;
}
}
int main(){
cout << "Hello,双向链表!" << endl;
DblList intList;
DblListNode *node1, *node2, *node3, *node4, *node5;
node1 = new DblListNode();
node2 = new DblListNode();
node3 = new DblListNode();
node4 = new DblListNode();
node5 = new DblListNode();
node1->data = 10;
node2->data = 20;
node3->data = 30;
node4->data = 40;
node5->data = 50;
intList.Insert(node1, intList.first);
intList.Insert(node2, intList.first);
intList.Insert(node3, intList.first);
intList.Insert(node4, intList.first);
intList.Insert(node5, intList.first);
intList.Delete(node2);
cout << intList.first->rlink->data << endl;
cout << intList.first->rlink->rlink -> data << endl;
cout << intList.first->rlink->rlink->rlink->data << endl;
cout << intList.first->rlink->rlink->rlink->rlink->data << endl;
cout << intList.first->rlink->rlink->rlink->rlink->llink->data << endl;
cout << intList.first->rlink->rlink->rlink->rlink->llink->llink->data << endl;
system("pause");
return 0;
}
总结:双向链表比较灵活,所以用起来比较方便,这个例子比较简单,在插入节点是要调整指针,在删除节点时也要调整指针,主要delete和new对应。