typedef struct DNode {
Elemtype data;
struct DNode* prior, * next;
}DNode,*DLinkList;
bool InitDLinkList(DLinkList& L) {
L = (DNode*)malloc(sizeof(DNode));
if (L==NULL)
{
return false;
}
L->prior = NULL;//头结点的prior永远指向NULL
L->next = NULL;
return true;
}
bool InsertNextDNode(DNode* p, DNode* s) {
if (p == NULL && s == NULL) {
return false;
}
s->next = p->next;
if (p->next != NULL) {
//针对最后一个节点的特殊处理
//如果p结点有后继节点,则对其后继节点的前驱指针变换,如果p结点为最后一个节点,则不执行前驱指针变换。
p->next->prior = s;
}
s->prior = p;
p->next = s;
return true;
}
bool InsertPriorDNode(DNode* p, DNode* s) {
if (p == NULL && s == NULL) {
return false;
}
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
}
//删除结点的后继节点
bool DelNextDNode(DNode* p) {
if (p==NULL)
{
return false;
}
DNode* q = p->next;
if (q == NULL) {
return false;//p没有后继节点
}
p->next = q->next;
if (q->next!=NULL)
{
q->next->prior = p;
}
free(q);
return true;
}
删除方法的调用——销毁链表
void DestoryDNode(DLinkList& L) {
while (L->next!=NULL)
{
DelNextDNode(L);
}
free(L);
L = NULL;
}
//按位查找,返回第i个元素
//时间复杂度O(n)
DNode* GetElem(DLinkList L, int i) {
if (i < 0)
{
return NULL;
}
DNode* p;
int j = 0;
p = L;//L先指向头结点(第0个结点,不存数据)
while (p != NULL && j < i)
{
p = p->next;
j++;
}
return p;
}
//时间复杂度O(n)
DNode* LocateElem(DLinkList L, int e) {
DNode* p = L->next;
while (p != NULL && p->data != e)//从第一个节点开始查找data域为e的点
{
p = p->next;
}
return p;//存在e值返回结点指针,不存在返回NULL
}
与单链表不同的是,双链表可以向前遍历查找
//向前遍历
while(p!=NULL){
p=p->prior;
}