问答题 试设计一个实现下述要求的Locate运算的函数。设有一个带表头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针lLink、指向后继结点的指针rLink、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0。每当在链表上进行一次Loeate(L,x)操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面,使得链表中所有结点保存按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。
【正确答案】
【答案解析】bool Locate(DblList &L,Type x){
//在双向链表中查找值为x的结点,找到后该结点被搬到适当位置,函数返回true,
//否则函数返回false。
DblNode * p=L->rLink, * q;
while (p!=NULL&&p->data!=x)p=p->rLink;
if(p!=NULL){ //链表中存在x
p->freq++;q=p; //该结点的访问频度加1
q->iLink->rLink=q->rLink; //从链表中摘下这个结点
q->rLink->ILink=q->iLink;
p=q->lLink; //寻找重新插入的位置
while (p!=L&&q->freq>p->freq) p=p->lLink;
q->rLink=p->rlink;q->llink=p; //插入在p之后
p->rLink->lLink=q;p->rLink=q;
return true;
}
else return false; //没找到