设头指针为L的带有表头结点的非循环双向链表,其每个结点中除有pre((前驱指针)、data(数据)和next(后继指针)域外,还有一个访问频度域freq。在链表被启用前,其值均初始化为零。每当在链表中进行一次 locate(L,x)运算时令元素值为ⅹ的结点中freq域的值増1,并使此链表中结点保持按访冋频度非增递减)的顺序排列,同时最近访问的结点排在频度相冋的结点前面,以便使频繁访问的结点总是靠近表头。试编写符合上述要求的 Locate(L,x)运算的算法,该运算为函数过程,返回找到结点的地址,类型为指针型
DLinkList Locate(DLinkList &L,ElemType x)
{
DNode *p=L->next,*q;
while(p&&p->data!=x)
p=p->next;
if(!p)
exit(0);
else
{
p->freq++;
if(p->next!=NULL)
p->next->pred=p->pred;
p->pred->next=p->next;
q=p->pred;
while(q!=L&&q->freq<=p->freq)
q=q->pred;
p->next=q->next;
q->next->pred=p;
p->pred=q;
q->next=p;
}
return p;
}