zoukankan      html  css  js  c++  java
  • 数据结构-字典

    往往不做集合的并、交、差运算,而经常需要判定某个元素是否在给定集合中,并且对集合作插入、删除操作。

    把字典定义为名字-属性对的组合,根据问题的不同,可以为名字和属性赋予不同的意义。

    典型的字典组织方式有线性表、跳表、散列表

    字典的抽象数据类型:

    const int DefaultSize=26
    template <class Name,class Attribute>
    Class Dictionary{
        //对象:一组名字属性对,其中名字是唯一的
    public:
        Dictionary(int size=DefaultSize);
        bool Member(Name name);
        Attribute *search(Name name);
        void Insert(Name name,Attribute attr);
        void Remove(Name name);
    }

    用有序链表表示字典

    链表中的每个结点表示字典的一个元素,各个结点按照结点中保存的关键码kl非递减链接,搜索一般不要搜索整个表

    关键码可重复,搜索和删除操作只会操作遇到的第一个结点

    在有n个结点的有序链表中,搜索、插入、删除操作的时间复杂度均为O(n)

    #include <iostream>
    #include <assert.h>
    using namespace std;
    
    //E是元素的数据类型,它也是一个类,有自己的一些属性,其中包括K。K则是关键码的数据类型,在跳表中也用类定义
    template <class E,class K>
    struct ChainNode {
        E data;
        ChainNode<E, K> *link;
        ChainNode():link(NULL){};
        ChainNode(E &el, ChainNode<E, K> *next = NULL):data(el),link(next){};
    };
    
    template <class E,class K>
    class SortedChain{
    public:
        SortedChain(){
            first=new ChainNode<E,K>;
            assert(first!=NULL);
        }
        ~SortedChain();
        ChainNode<E,K> *Search(const K kl)const;
        void Insert(const K kl,E& el);
        bool Remove(const K kl,E& el);
        ChainNode<E,K> *Begin(){return first->link;}
        ChainNode<E,K> *Next(ChainNode<E,K> *current)const{
            if(current!=NULL) return current->link;
            else return NULL;
        };
    private:
        ChainNode<E,K> *first;
    };
    
    template <class E,class K>
    ChainNode<E,K> *SortedChain<E,K>::Search(const K kl)const{   //搜索关键码为kl的元素
        ChainNode<E,K> *p=first->link;
        while(p!=NULL && p->data<kl) p=p->link;
        if(p!=NULL && p->data==kl) return p;
        else return NULL;
    };
    
    template <class E,class K>
    void SortedChain<E,K>::Insert(const K kl,E& el){
        ChainNode<E,K> *p=first->link,*pre=first,*newNode;
        while(p!=NULL && p->data<kl){
            pre=p;
            p=p->link;
        }
        if(p!=NULL && p->data==kl){
            p->data=el;
            return;
        }
        newNode=new ChainNode<E,K>(kl,el);
        if(newNode==NULL){
            cerr<<"存储分配失败!"<<endl;
            exit(1);
        }
        newNode->link=p;
        pre->link=newNode;
    };
    
    template <class E,class K>
    bool SortedChain<E,K>::Remove(const K kl,E& el){
        ChainNode<E,K> *p=first->link,*pre=first;
        while(p!=NULL && p->data<kl){
            pre=p;
            p=p->link;
        }
        if(p!=NULL && p->data==kl){
            pre->link=p->link;
            el=p->data;
            delete p;
            return true;
        }
        else return false;   //关键码不存在
    };
    
    //假设每个元素的数据类型E为person
    class person{
        friend void main(void);
    public:
        person& operator=(long kl){ID_number=kl;return *this;}
        bool operator<(long kl){return(ID_number<kl);}
        bool operator<(person& pr){return(ID_number<pr.ID_number);}
        bool operator>(long kl){return(ID_number>kl);}
        bool operator>(person& pr){return(ID_number>pr.ID_number);}
        bool operator==(long kl){return(ID_number==kl);}
        bool operator==(person& pr){return(ID_number==pr.ID_number);}
    private:
        long ID_number;   //关键码ID_number即为K,数据类型为long
    }
  • 相关阅读:
    doGet() throws NamingException报错
    关于spring配置文件中编辑时没有提示信息的问题
    关于The hierarchy of the type TestBeforeAdvice is inconsistent的问题
    安装 nodejs,npm,pm2
    centos 6.5 单实例搭建 ELK
    修改默认归档日志
    oracle 表空间总结
    oracle 归档日志总结
    oracle 的一些基础查询
    tomcat 绑定ipv4端口
  • 原文地址:https://www.cnblogs.com/yangyuliufeng/p/9480063.html
Copyright © 2011-2022 走看看