数据结构(C语言)(第2版) 严蔚敏 人民邮电
循环链表
偶尔使用尾指针:
终端 rear
头结点 rear->next
首元结点 rear->next->next
与单链表的区别->判定表尾结点:
单链表:p!=NULL / p->next!=NULL
循环链表:p!=L / p->next!=L
双向链表
//----------存储结构O(n)
typedef struct DuLNode
{
ElemType data;
struct DuLNode *prior; //直接前驱
struct DuLNode *next; //直接后继
}DuLNode, *DuLinkList;
//-----------插入
Status ListInsert_DuL(DuLinkList &L,int i,ElemType e)
{//在带头结点的双向链表L中第i个位置之前插入元素e
if(!(p=GetElem_DuL(L,i))) //在L中确定第i个元素的位置指针p
return ERROR;//p为NULL时,第i个元素不存在
s=new DuLNode;
s->data=e;
s->prior=p->prior;
s->prior->next=s;
s->next=p;
p->prior=s;
return OK;
}
//-----------删除
Status ListDelete_DuL(L,i)
{//删除带头结点的双向链表L中的第i个元素
if(!(p=GetElem_DuL(L,i)))
return ERROR;
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
return OK;
}
定义
存储密度=数据元素本身占用的存储量/节点结构占用的存储量