题目描述:
设有一头指针为L的带有表头结点的非循环双向链表,其每个结点中除有pred(前驱指针)、data(数据)和next(后继指针)域外,还有一个访问频度域freq。在链表被起用前,其值均初始化为零。每当在链表中进行一次Locate(L,x)运算时,令元素值为x的结点中freq域的值增1,并使此链表中结点保持按访问频度非增(递减)的顺序排列,同时最近访问的结点排在频度相同的结点的最后,以便使频繁访问的结点总是靠近表头。试编写符合上述要求的Locate(L,x)运算的算法,该运算为函数过程,返回找到结点的地址,类型。
算法思想:
核心代码:
typedef struct LNode
{
int data;
struct LNode *pre;
struct LNode *next;
int freq;
}LNode,*LinkList;
LNode* Locate(LNode *L,int x)
{
LNode* p;
p=L->next;
while(p!=NULL)
{
if(p->data==x)
break;
p=p->next;
}
if(p==NULL)
{
printf("不存在值为x的结点");
return 0;
}
else
{
p->freq++;
LNode* temp=p;
temp->next->pre=temp->pre;
temp->pre->next=temp->next;//p点被摘下
LNode* q=L->next;
while(q!=NULL&&q->freq<p->freq)
q=q->next;
p->pre=q->pre;
q->pre->next=p;
p->next=q;
q->pre=p;
}
return L;
}