A-A+
设有一个双链表 每个结点中除有prior data和next这3个域外 还有一个访问频度域f
问题详情
设有一个双链表,每个结点中除有prior、data和next这3个域外,还有一个访问频度域freq,在链表被启用之前,其值均初始化为零。每当在链表进行一次L0CateNode(L,x)运算时,令元素值为x的结点中freq域的值加1,并调整表中结点的次序,使其按访问频度的递减序排列,以便使频繁访问的结点总是靠近表头。试写一符合上述要求的L,oCateNode运算的算法。
请帮忙给出正确答案和分析,谢谢!
参考答案
正确答案:DList locate(DList LElemType x)∥L是带头结点的按访问频度递减的双向链表{DList P=L一>nextq; ∥P:为L表的工作指针q为P的前驱用于查找插入位置while(P&&p一>data!=x)P:p->next; //查找值为x的结点if(!P){printf(“不存在所查结点\n”);exit(0);}else{p一>freq++; ∥令元素值为x的结点的freq域加1p一>next一>pred=p一>pred; //将P结点从链表上摘下p一>pred一>next=p一>next;q=p一>pred; //以下查找P结点的插入位置while(q!=L&&q一>freq<p一>freq)q=q一>pred;p一>next=q一>next;q一:>next一>pred=P;∥将P结点插入p->pred=q;q一>next=P;}return(P); ∥返回值为x的结点的指针}∥算法结束
在算法中先查找数据x,查找成功时结点的访问频度域增1,最后将该结点按频度递减插入链表中