双向链表:
在单链表的每个节点里再增加一个指向其直接前驱的指针域prior,形成双向的链表。
定义:
typedef struct DuLNode{
Elemtype data;
struct DuLNode *prior,*next;
}DuLNode,*DuLinkList;
双向循环链表:
头结点的前驱节点指向链表的最后一个节点;
最后一个结点的后继指针指向头节点。
双向链表的对称性:
p->prior->next=p=p->next->prior
双向链表的插入:
void ListInsert_DuL(DuLinkList &L,Int i,Elemtype e){
//在带头结点的双向循环链表L中第i个位置之前插入元素e
if(!(p=GetElemP_DuL(L,i)))//如果p不是指向第i个位置 return ERR;
s=new DuLNode; s->data=e;
s->prior=p->prior; p->prior->next=s;
s->next=p; p->prior=s;
return OK;
}//ListInsert_DuL
双向链表的删除
void ListDelete_DuL(DuLink &L,Int i,ElemType &e){
//删除带头结点的双向循环链表L的第i个元素,并用e返回
if(!(p=GetElemP_DuL(L,i)))//如果p不是指向第i个位置 return ERR;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return OK;
}//ListDelete_DuL
存储密度=节点数据本身占用的空间/节点占用的空间总量
顺序表的存储密度为1;链表的存储密度<1.

3015

被折叠的 条评论
为什么被折叠?



