1. 程式人生 > >非循環雙鏈表 | 使訪問頻率高的元素靠前排列的查找函數

非循環雙鏈表 | 使訪問頻率高的元素靠前排列的查找函數

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(
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); }
View Code

註意:

註意判斷條件處的小於符號,只有掃描到大於等於p的前驅才能跳出循環

測試效果:

技術分享圖片

註:輸出結構為(freq,data)

非循環雙鏈表 | 使訪問頻率高的元素靠前排列的查找函數