zoukankan      html  css  js  c++  java
  • 非循环双链表 | 使访问频率高的元素靠前排列的查找函数

    王道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("
    ");
    }
    
    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
    ",Locate(A,3)->data);
        show_list(A);
        printf("x=%d
    ",Locate(A,2)->data);
        show_list(A);
        printf("x=%d
    ",Locate(A,2)->data);
        show_list(A);    
        printf("x=%d
    ",Locate(A,1)->data);
        show_list(A);    
        printf("x=%d
    ",Locate(A,1)->data);
        show_list(A);    
        printf("x=%d
    ",Locate(A,1)->data);
        show_list(A);    
    }
    View Code

    注意:

    注意判断条件处的小于符号,只有扫描到大于等于p的前驱才能跳出循环

    测试效果:

    注:输出结构为(freq,data)

  • 相关阅读:
    2014-3-10 时间都去哪了,还没好好感受年轻就老了
    2014-3-4 思杨昨天已经顺利到老家 --------- 回忆思杨之2--“叫你不穿鞋鞋”
    2014-3-4 鬼脸笑笑的思杨
    路由
    视图
    请求与响应
    序列化组件
    APIView源码分析
    CBV源码分析
    DRF入门规范
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8452705.html
Copyright © 2011-2022 走看看