3、循环链表
循环链表的特点是表中最后一个结点的指针域指向头结点,从表中任一结点出发均可找到表中其他结点。判断循环链表是否为空,可测试p是否等于头指针。
4、双向链表
在双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前驱。在双向链表中,NextElem和PriorElem的执行时间为
O(1)。
//--------------------线性表的双向链表存储结构----------------------
typedef int ElemType;
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;
//--------------------带头结点的双链循环性表L中第i个位置之前插入元素e----------------------
//--------------------i的合法值为1 <= i <= 表长+1----------------------
Status ListInsert_DuL(DuLinkList &L, int i, ElemType e){
DuLNode *s, *p;
if (!(p = GetElemP_DuL(L, i))) //在L中确定第i个元素的位置指针p
return ERROR;
if (!(s = (DuLinkList)malloc(sizeof (DuLNode))))
return ERROR;
s ->data = e;
s ->prior = p ->prior;
p ->prior ->next = s;
s ->next = p;
p ->prior = s;
return OK;
}
//--------------------删除带头结点的双链循环性表L中第i个元素,i的合法值为1<= i <= 表长----------------------
Status ListDelete_DuL(DuLinkList &L, int i, ElemType &e){
DuLNode *p;
if (!(p = GetElemP_DuL(L, i))) //在L中确定第i个元素的位置指针p
return ERROR;
e = p ->data;
p ->prior ->next = p ->next;
p ->next ->prior = p ->prior;
free (p);
return OK;
}