#include <iostream>
//带表头的双向链表
using namespace std;
class DblList;
class DblListNode
{
friend class DblList;
public:
int data;//数据域
DblListNode *llink;//指向左边节点
DblListNode *rlink;//指向右边的节点
};
class DblList
{
public:
DblList()
{
first = new DblListNode();
first->llink = first;//表头的左节点指向自己
first->rlink = first;//表头的右节点指向自己
}
//插入新的节点需要指定一个节点插入到另外一个节点右边
void Insert(DblListNode*, DblListNode*);
//删除指针所指向的节点
void Delete(DblListNode*);
DblListNode *first;
private:
//DblListNode *first;
};
//插入新的节点,需要指定新插入的一个节点(p)插入到另外一个节点(x)右边
void DblList::Insert(DblListNode *p, DblListNode *x)
{
//需要调整四个指针
//p
p->llink = x;//p的左指针指向x
p->rlink = x->rlink; //p的右边为x右边原来指向的节点
//x
x->rlink->llink = p;//x原来的右边的左边就应该指向p,因为p成为了新的左边
x->rlink = p;//x的右边现在变成了p
}
void DblList::Delete(DblListNode *x)
{
if (x == first)
{
cerr << "Deletion of head node not permitted." << endl;
}
else
{
x->llink->rlink = x->rlink;
x->rlink->llink = x->llink;
delete x;
}
}
int main()
{
DblList intList;
DblListNode *node1 = new DblListNode();
DblListNode *node2 = new DblListNode();
DblListNode *node3 = new DblListNode();
DblListNode *node4 = new DblListNode();
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;
return 0;
}