双向链表(数据结构C语言)

在双链表中,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 ; 
 } 

 

你可能感兴趣的:(算法,双链表,C语言)