/* 设有一个双链表L,每个结点中除有prior,data和next这三个域外,还有一个访问频度域 freq,在链表被启用之前,其值初始化为零。当在链表进行一次LocateNode(L,x)运算时,令 元素值为x的结点中freq域的值加1,表调整表中结点的次序,事前访问频度的递减排列,以便 使访问的结点总是靠近表头。试写一符合上述要求的LocateNode运算的算法。 */ typedef struct DuLNode{ ?? ?Elemtype data; ?? ?int freq; ?? ?struct DuLNode *pred,*next; }*DList; DList locate(DList L,Elemtype x){ ?? ?DList p=L->next,q; ?? ?while(p&&p->data!=x) p=p->next; ?? ?if(!p){ ?? ??? ?printf("不存在所查结点\n");exit(0); ?? ?} ?? ?else{ ?? ??? ?p->freq++; ?? ??? ?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); }
|