双链表的初始化
typedef struct DNode{
ElemType data;d
struct DNode *prior,*next;//前驱结点,后继结点
}
bool InitDLinkList(DLinkList &L){
L=(DNode *)malloc(sizeof(DNode));
if(L==NULL)//内存分配失败
return false;
L->prior=NULL;
L->next=NULL;
return true;
}
void testDLinkList(){
DLinkLine L;
InitDLinkList(L);
}
双链表的插入操作(尾插法)
将s的新结点插入p结点之后
Case 1:p结点的next不为NULL
bool InsertNextNode(DNode *p,DNode *s){
if(p==NULL||s==NULL)
return false;
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
Case 2:p结点的next为NULL(也适用于Case1)
bool InsertNextDNode(DNode *p,DNode *s){
if(p==NULL||s==NULL)
return false;
s->next=p->next;
if(p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
双链表的删除操作
删除p结点的后继结点
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;
}
双链表的遍历
//后向遍历
while(p!=NULL){
p=p->next;
}
//前向遍历
while(p!=NULL){
p=p->prior;
}
由于双链表的按值查找和按位查找与单链表的情况相同,且双链表不可随机存取。故时间复杂度为O(n)
销毁双链表
void DestoryList(DLinkList &L){
//循环释放各个结点数据
while(L->next!=NULL)
DeleteNextDNode(L);
free(L);//释放头结点
L=NULL;
}
引用于王道《数据结构》