/*设头指针为L的带有表头结点的非循环双向链表,其每个结点中除有pred(前驱指针)、data(数据)和next(后继指针)域外,
还有一个访问频度域freq。在链表被启用前,其值均初始化为零。每当在链表中进行一次Locate(L,x)运算时,令元素值为x
的结点中freq域的值增1,并使此链表中结点保持按访问频度非增(递减)的顺序排列,同时最近访问的结点排在频度相同的
结点前面,以便使频繁访问的结点总是靠近表头。试编写符合上述要求的Locate(L,x)运算的算法,该运算为函数的过程,
返回找到结点的地址,类型为指针型。*/
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct DNode{
ElemType data;
int freq;
struct DNode *pred;
struct DNode *next;
}DNode,*DLinkList;
DLinkList createHeadList(DLinkList &L)
{
ElemType x;
L = (DLinkList)malloc(sizeof(DNode));
DNode *r = L;
scanf("%d",&x);
while(x!=9999)
{
DNode *s = (DNode*)malloc(sizeof(DNode));
s->data = x;
s->freq = 0;
s->pred = r;
r->next =s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
DNode *Locate(DLinkList &L,ElemType x)
{
DNode *pre = L;
DNode *p = pre->next;
DNode *q;
while(p&&p->data!=x)
p = p->next;
if(!p){
printf("不存在值为%d的结点\n",x);
exit(0);
}else{
p->freq++;
if(p->next!=NULL)
p->next->pred = p->pred;
p->pred->next = p->next;
q = p->pred;
while(q!=L && q->freq<=p->freq)
q = q->pred;
p->next = q->next;
q->next->pred = p;
p->pred = q;
q->next = p;
}
return p;
}
bool printList(DLinkList L)
{
DNode *p = L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return true;
}
void main()
{
DLinkList L;
createHeadList(L);
printList(L);
Locate(L,3);
printf("After:\n");
printList(L);
}
12-05
981
04-19
1033