有—个双向循环链表,每个结点有四个域,prior、next、data 和 freq。设计一个实现 下述要求的 Locate 运算的算法:初始化时,freq 域的值都为 0,每当在链表 s 中进行一 次 Locate (s,x)运算时,令元素值为 x 的节点中 freq 域的值增加 1,并使此链表中结点保 持按访问频度递减的顺序排列,以便使频繁访问的结点总是靠近表头。
typedef struct DuLNode{
ElemType data;
int freq;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode, *DuLinkList;
/* Locate 函数在 s 中查找 x,查找成功返回结点的地址,失败返回 NULL */
/* 同时要保证链表中结点按 freq 递减的顺序排列 */
DuLinkList Locate(DuLinkList s, ElemType x){
DuLinkList p,q; p=s>next;
while(p!=s &&p>data!=x) p=p>next;
if(p==s)
return NULL;
p>freq++;
q=p>prior; /*向前查找*/
while(q!=s && q>freq<p>freq)
q=q>prior;
if (q!=p>prior)//交换p、q所在结点
{
p>prior>next=p>next;
p>next>prior=p>prior;
p>next=q>next;
q>next>prior=p;
q>next=p;
p>prior=q;
}
return p;
}