非循環雙鏈表 | 使訪問頻率高的元素靠前排列的查找函數
阿新 • • 發佈:2018-02-18
esp opened lose 掃描 tex post clu 排列 node
王道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(View Codeint * 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)
非循環雙鏈表 | 使訪問頻率高的元素靠前排列的查找函數