/*
设有一个双链表L,每个结点中除有prior,data和next这三个域外,还有一个访问频度域
freq,在链表被启用之前,其值初始化为零。当在链表进行一次LocateNode(L,x)运算时,令
元素值为x的结点中freq域的值加1,表调整表中结点的次序,事前访问频度的递减排列,以便
使访问的结点总是靠近表头。试写一符合上述要求的LocateNode运算的算法。
*/
typedef struct DuLNode{
Elemtype data;
int freq;
struct DuLNode *pred,*next;
}*DList;
DList locate(DList L,Elemtype x){
DList p=L->next,q;
while(p&&p->data!=x) p=p->next;
if(!p){
printf("不存在所查结点\n");exit(0);
}
else{
p->freq++;
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);
}
【无标题】频度递减排序
最新推荐文章于 2025-05-01 13:25:47 发布