【双链表的概念】
每个结点既保存直接后继结点的地址,又保存直接前驱结点的地址。
【双链表的类设计】
template<class elemType>
class dLinkList :public list<elemType>
{
private:
struct node
{
elemType data;
node* prev, * next;
node(const elemType& x, node* p = NULL, node* n = NULL)
{
data = x;
next = n;
prev = p;
}
node():next(NULL),prev(NULL){}
~node(){}
};
node* head, * tail;//头指针和尾指针
int currentLength;
node* move(int i)const;
public:
dLinkList();
~dLinkList()
{
clear();
delete head;
delete tail;
}
void clear();
int length()const { return currentLength; }
void insert(int i, const elemType& x);
void remove(int i);
int search(const elemType& x)const;
elemType visit(int i)const;
void traverse()const;
};
【功能函数的设计】
//move函数
template<class elemType>
dLinkList<elemType>::node* dLinkList<elemType>::move(int i) const
{
node* p = head;
while (i-- >= 0)
p = p->next;
return p;
}
//构造函数
template<class elemType>
dLinkList<elemType>::dLinkList()
{
head = new node;//此处调用node类缺省的构造函数,此时head的prev和next都置为了空指针
head->next = tail = new node;
tail->prev = head;
currentLength = 0;
}
//clear函数
template<class elemType>
void dLinkList<elemType>::clear()
{
node* p = head->next, * q;
head->next = NULL;
while (p != NULL)
{
q = p->next;
delete p;
p = q;
}
node* p = tail->prev, * q;
tail->prev = NULL;
while (p != NULL)
{
q = p->prev;
delete p;
p = q;
}
currentLength = 0;
}
//insert函数
template<class elemType>
void dLinkList<elemType>::insert(int i, const elemType& x)
{
node* pos, * tmp;
pos = move(i);
tmp = new node(x, pos->prev, pos);
pos->prev->next = tmp;
pos->prev = tmp;
currentLength++;
}
//remove函数
template<class elemType>
void dLinkList<elemType>::remove(int i)
{
node* pos;
pos = move(i);
pos->prev->next = pos->next;
pos->next->prev = pos->prev;
delete pos;
currentLength--;
}
//search函数
template<class elemType>
int dLinkList<elemType>::search(const elemType& x) const
{
node* p = head->next;
int i = 0;
while (p != NULL && p->data != x)
{
p = p->next;
i++;
}
if (p == NULL)
return -1;
else
return i;
}
//visit函数
template<class elemType>
elemType dLinkList<elemType>::visit(int i) const
{
return move(i)->data;
}
//traverse函数
template<class elemType>
void dLinkList<elemType>::traverse() const
{
node* p = head->next;
cout << endl;
while (p != NULL)
{
cout << p->data;
p = p->next;
}
cout << endl;
}
上面的代码没有写很多注释,双链表和单链表的功能函数实现比较类似,只有少部分有改动,详情可以参考下面这篇文章: