非循环双链表 | 使访问频率高的元素靠前排列的查找函数
Posted TQCAI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非循环双链表 | 使访问频率高的元素靠前排列的查找函数相关的知识,希望对你有一定的参考价值。
王道P38T20
主代码:
DLinkList Locate(DLinkList& L,int x){ //查找元素值为x的元素 int i; DNode *p=L->next, *q; while(p!=NULL){ if(p->data == x){ //将指针p移动到最前面 p->freq++; q=p->pred; while(q!=L && q->freq < p->freq){ q=q->pred; } p->pred->next=p->next; p->next->pred=p->pred; p->next=q->next; q->next->pred=p; p->pred=q; q->next=p; return p; } p=p->next; } }
完整代码:
#include <cstdio> #include <stdlib.h> using namespace std; typedef struct DNode{ int data,freq; struct DNode* next=NULL; struct DNode* pred=NULL; DNode(int x=0,int f=0){ data=x; freq=f; } }DNode; typedef DNode* DLinkList; DLinkList build_list(int * arr,int n){ int i; DLinkList L=new DNode; DLinkList pre=L,p; for(i=0;i<n;i++){ p=new DNode(arr[i]); pre->next=p; p->pred=pre; pre=p; } return L; } void show_list(DLinkList& L){ DLinkList p=L->next; while(p!=NULL){ printf("(%d,%d) ",p->freq,p->data); p=p->next; } puts("\\n"); } void append(DLinkList& L,int d){ DNode* p=new DNode(d); DNode* end=L; while(end->next!=NULL) end=end->next; end->next=p; p->pred=end; } void insert(DLinkList& L,int i,int d){ DNode* p=L,*n=new DNode(d); for(int j=0;j<i && p->next!=NULL;j++) p=p->next; n->next=p->next; if(p->next) p->next->pred=n; n->pred=p; p->next=n; } DLinkList Locate(DLinkList& L,int x){ //查找元素值为x的元素 int i; DNode *p=L->next, *q; while(p!=NULL){ if(p->data == x){ //将指针p移动到最前面 p->freq++; q=p->pred; while(q!=L && q->freq < p->freq){ q=q->pred; } p->pred->next=p->next; p->next->pred=p->pred; p->next=q->next; q->next->pred=p; p->pred=q; q->next=p; return p; } p=p->next; } } int main(){ const int n=6; int A_arr[n]={1,2,3,4,2,1}; DLinkList A=build_list(A_arr,n); show_list(A); printf("x=%d\\n",Locate(A,3)->data); show_list(A); printf("x=%d\\n",Locate(A,2)->data); show_list(A); printf("x=%d\\n",Locate(A,2)->data); show_list(A); printf("x=%d\\n",Locate(A,1)->data); show_list(A); printf("x=%d\\n",Locate(A,1)->data); show_list(A); printf("x=%d\\n",Locate(A,1)->data); show_list(A); }
注意:
注意判断条件处的小于符号,只有扫描到大于等于p的前驱才能跳出循环
测试效果:
注:输出结构为(freq,data)
以上是关于非循环双链表 | 使访问频率高的元素靠前排列的查找函数的主要内容,如果未能解决你的问题,请参考以下文章