【正确答案】[解答] 算法如下:
int LocateNode(DuLinkList&h,ElemType x){
DuLinkList P=h->next,q;
while(p!=NULL && P->data! =x)
P=P->next; //找data域值为x的结点*P
if(p==NULL) //未找到这样的结点
return 0;
else{ //找到这样的结点*P
P->freq++; //频度增1
q=q->prior; //*q为*P前驱结点
if(q!=h){ //若*P为第一个数据结点,则不移动
while(q!=h && q->freq<p->freq)
//找到*q结点,使q->freq>=P->freq
q=q->prior:
P->prior->next=P->next; //先删除*P结点
if(P->next!=NULL)
P->next->prior=P->prior;
P->next=q->next; //将*P结点插入到*q结点之后
if(q->next!=NULL)
q->next->prior=P;
q->next=P;
P->prior=q;
}
return 1;
}
}
【答案解析】[解析] 在DuLinkList类型的定义中添加freq域(int类型),给该域初始化为0。在每次查找到一个结点*p时,使其freq域增1,再在*p结点的前面找到一个结点*q,它或是头结点或是满足q->freq>=p->freq,然后删除*p结点,使其插入到*q结点之后。