`

字 典

阅读更多
字典:以集合为基础,并支持支持Member,Insert和Remove三种运算的抽象数据类型。
字典是一些元素的集合,每个元素有一个称作关键码的域,不同元素的关键码互不相同
组织方式:线性表,跳表(skip list),散列表(hash table)
线性表
#include<assert.h>

template<typename E,typename K>
class ChainNode{
public:
    E data;
    ChainNode<E,K> *link;
    ChainNode():link(NULL){};
    ChainNode(E& e1,ChainNode<E,K>*next=NULL):data(e1),link(next){};
};

template<typename E,typename K>
class SortedChain{
public:
    SortedChain(){
        first = new ChainNode<E,K>;
        assert(first!=NULL);
    }
    ~SortedChain();
    ChainNode<E,K> *Search(const K k1)const;
    void Insert(const K k1,E& e1);
    bool Remove(const K k1,E& e1);
    ChainNode<E,K> *Begin(){
        return first->link;
    }
    ChainNode<E,K> *Next(ChainNode<E,K> *current)const{
        if(current!=NULL)
            return current->link;
        return NULL;
    }
private:
    ChainNode<E,K> *first;
};

template<typename E,typename K>
ChainNode<E,K>* SortedChain<T>::Search(const K k1) const
{
    ChainNode<E,K> *p = first->link;
    while(p!=NULL&&p->data<k1)
        p = p->link;
    if(p!=NULL&&p->data==k1)
        return p;
    return NULL;
}

/*
  在大于k1之后插入e1,如果有k1用e1替换
  */
template<typename E,typename K>
void SortedChain<T>::Insert(const K k1, E &e1)
{
    ChainNode<E,K> *pre,*p,*newNode;
    p = first->link;
    pre = first;
    while(p!=NULL&&p->data<k1){
        pre = p;
        p = p->link;
    }
    if(p!=NULL&&p->data==k1){
        p->data = e1;
        return;
    }
    newNode = new ChainNode<E,K>(e1);
    assert(newNode!=NULL);
    newNode->link = p;
    pre->link = newNode;
}

/*
  删除k1
  */
template<typename E,typename K>
bool SortedChain<E,K>::Remove(const K k1, E &e1)
{
    ChainNode<E,K> *p,*pre;
    p = first->link;
    pre = first;
    while(p!=NULL&&p->data<k1){
        pre = p;
        p = p->link;
    }
    if(p!=NULL&&p->data==k1){
        pre->link = p->link;
        p->data = e1;
        delete p;
        return true;
    }
    return false;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics