在双链表中,NextElem 的函数执行时间为O(1),而 PriorElem 的执行时间为O(n) 所以定义了双链表的概念
双链表的存储结构为的代码实现
//2020.7.26 飞飞飞 双向链表的存储结构
typedef struct DuLNode{
ElemType data ;
struct DuLNode *prior ;
struct DuLNode *next ;
}DuLNode, * DuLinkList;
双向链表中有两个指针域,分别为直接前驱和直接后继
我们可以用一段代码来简单表示一下特性
d -> next -> prior = d -> prior -> next = d ;
双向链表中的在第i个结点前插入元素 和 删除第i个结点的代可以表示为
//2020.7.26 飞飞飞 双向链表的第i 个结点的插入和删除函数实现
Status LinkInsert_DuL(DuLinkList &L , int i , ElemType &e){
if(! (p = GetElemP_DuL(L , i)) return ERROR ;
if(!(s = (DuLinkList)malloc (sizeof(DuLNode)))) return ERROR ;
s -> data = e ;
s -> prior = p -> prior ;
s -> next = p ;
p -> prior -> next = s ;
p -> prior = s ;
return OK ;
}
Status LinkDelete_DuL(DulinkList &L , int i , ElemType e){
if(! (p = GetElemP_DuL(L , i)) return ERROR ;
e = p -> data ;
p -> prior -> next = p -> next ;
p -> next -> prior = p -> prior ;
frer (p);
return OK ;
}
补充一下单链表的组合(运用较多的函数)
//2020.7.26 飞飞飞 两个递增单链表的组合成一个递增单链表
Status MergeList_L(LinkList &LA , LinkList& LB ,LnkList &LC , int (* compare)(ElemType ElemType)){
if(! InitList LC) return ERROR ;
//首先用指针指向两个单链表的头节点
ha = GetHead (LA); hb = GetHead (LB) ;
//定义用于比较两个元素大小的指针
pa = NextPos (LA, ha) ;
pb = NextPos (LB , hb) ;
while(pa && pb){
a = GetCurElem (pa) ;
b = GetCurElem (pb) ;
if(* compare(a ,b) < 0){
//a < b
DelFirst (ha , p) ; //删除hb头结点的第一个结点,并以p 返回
Append (LC , p) ; //放到LC链表中
pa = NextPos (LA ,ha) ; //pa指针指向新的第一个结点
}
else
{
//a >= b
DelFirst (hb p) ;
Append (LC , p) ;
pb = NextPos (LB , hb) ;
}
}
if(pa) Append(LC ,pa) ;
else Append (LC ,pb) ;
FreeNode(ha) ;
FreeNode(hb) ;
return OK ;
}