locate(L,x)的算法

来源:百度知道 编辑:UC知道 时间:2024/05/18 19:00:25
题目:有一个双链表,每个结点除有prior,data和next3个域外,还有一频度域freq,在链表被启用前其值初始化为零。每当在链表上进行一次locate(L,x)运算时,令元素值为x的结点中freq域的值增加1,并使此链表中的结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。设计符合上述要求的locate(L,x)算法

以下是过程的一部分,麻烦帮忙补充及修改完整,并把调试具体结果贴一下,谢谢。。。
int locate(dlink*h,elemtpye x)
{dlink*p=h->next,*q;
int i;
i=1;
while(p!=NULL&&p->data!=x)
{p=p->next; /*找data域值为x的结点p*/
i++;
}
if(p==NULL) /*未找到的情况*/
i=0;
else /*找到的情况*/
{p->freq++;
q=p->prior; /*向前检索*/
while(q!=h&&q->freq<p->freq)
{i--;
p->prior=q->prior; /*交换p和q的位置*/
p->prior->next=p;
q->next=p->next;
p->next->prior=q;
p->next=q;
q->prior=p;
}
}
return i;
}

while(p!=NULL&&p->data!=x)
{p=p->next; /*找data域值为x的结点p*/
i++;
}
在你为遇增加的时候,下面要进行节点排序,拍完序后就可以直接返回了,我看了你的,应该不会有什麽问题。