在上一节我们讲解了单链表的头插法和尾插法
http://t.csdn.cn/RixAu
但是单链表无法反向检索,对于某些情景可能造成不便,所以我们今天学习双链表
目录
1.双链表的初始化
2.双链表的插入
3.双链表的删除
4.遍历双链表
1.双链表的初始化
typedef int ElemType;
typedef struct DLinkList{
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;
L->next=NULL;
return true;
}
void testDLinkList()
{
DLinkList L;
InitLinkList(L);
}
//判断双链表是否为空
bool Empty(DLinkList L)
{
if(L->next==NULL)
return true;
else
return false;
}
2.双链表的插入
//在p结点之后插入s结点
bool InsertNextNode(DNode *p,DNode *s)
{
if(p==NULL || s==NULL)
return false;
s->next=p->next;//将结点*s插入到结点*p之后
if(p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
3.双链表的删除
bool DeleteNextDNode(DNode *p)
{
if(p==NULL)
return false;
DNode *q=p->next;
if(q==NULL)
return false;
p->next=q->next;
if(q->next!=NULL)
q->next->prior=p;
free(q);
return true;
}
void DestroyList(DLinkList &L)
{
//释放各数据结点
while(L->next!=NULL)
DeleteNextNode(L);
free(L);//释放头结点
L=NULL;//头指针指向NULL
}
4.遍历双链表
//后向遍历
while(p!=NULL)
{
p=p->next;
}
while(p!=NULL)
{
p=p->prior;
}
//前向遍历,跳过头结点
while(p->prior!=NULL)
{
p=->prior;
}
时间复杂度O(n)