关闭

字典结构及借助顺序表的实现

248人阅读 评论(0) 收藏 举报
分类:

字典的ADT C++定义:

#ifndef DICADT_H
#define DICADT_H

template <typename Key, typename E>
class Dictionary{
private:
    void operator=(const Dictionary&){}
    Dictionary(const Dictionary&){}

public:
    Dictionary(){}
    virtual ~Dictionary(){}

    //初始化字典
    virtual void clear() = 0;

    //插入一条记录
    //k: 插入的key
    //e: 插入的record
    virtual void insert(const Key& k, const E& e) = 0;

    //删除并返回此记录
    //k: 将被删除的key
    //return: 一条匹配的记录。如果有多条记录匹配key,任意删除一条,没匹配记录则返回NULL
    virtual E remove(const Key& k) = 0;

    //任意删除一条记录
    //return: 返回被删除的记录,不存在返回NULL
    virtual E removeAny() = 0;

    //return:一条匹配k的记录
    //多条匹配则返回任意一条
    virtual E find(const Key& k) const = 0;

    //返回记录总数
    virtual int size() = 0;
};
#endif

键值对KVpair的实现

template <typename Key, typename E>
class KVpair{
private:
    Key k;
    E e;

public:
    //constructors
    KVpair(){}
    KVpair(Key kval, E eval){
        k = val;
        e = eval;
    }
    KVpair(const KVpair& o){
        k = o.k;
        e = o.e;
    }

    Key key(){
        return k;
    }

    void setKey(Key ink){
        k = ink;
    }

    E value(){
        return e;
    }
};

使用无序数组实现的字典

template <typename Key, typename E>
class UALdict : public Dictionary<Key, E>{
private:
    AList<KVpair<Key, E> >* list;
public:
    UALdict(int size = defalutSize){
        list = new AList<KVpair<Key, E> >(size);
    }

    ~UALdict(){
        delete list;
    }

    void clear(){
        list->clear();
    }

    E remove(const Key& k){
        E temp = find(k);
        if (temp != NULL)
            list->remove();
        return temp;
    }

    //删除最后一个元素
    E removeAny(){
        Assert(size() != 0, "Dictionary is empty");
        list->moveToEnd();
        list->prev();
        KVpair<Key, E> e = list->remove();
        return e.value();
    }

    E find(const Key& k) const{
        for (list->moveToStart(); list->currPos() < list->length(); list->next()){
            KVpair<Key, E> temp = list->getValue();
            if (k == temp.key())
                return temp.value();
        }
        return NULL;
    }

    int size(){
        return list->length();
    }
};

有序表的实现:

//有序表
template <typename Key, typename E>
class SAList : protected AList<KVpair<Key, E> >{
public:
    SAList(int size = defaultSize)
        : AList<KVpair<Key, E> >(size)
    {}

    ~SAList(){}

    //重定义insert函数保证values有序
    void insert(KVpair<Key, E>& it){
        KVpair<Key, E> curr;
        for (moveToStart(); currPos() < length(); next()){
            curr = getValue();        //获取当前AList中的KVpair元素
            if (curr.key() > it.key())
                break;
        }
        AList<KVpair<Key, E> >::insert(it);//执行AList的insert函数
    }

    //除了append()函数以外,以下AList的函数仍可使用
    AList<KVpair<Key, E> >::clear;
    AList<KVpair<Key, E> >::remove;
    AList<KVpair<Key, E> >::moveToStart;
    AList<KVpair<Key, E> >::moveToEnd;
    AList<KVpair<Key, E> >::prev;
    AList<KVpair<Key, E> >::next;
    AList<KVpair<Key, E> >::length;
    AList<KVpair<Key, E> >::currPos;
    AList<KVpair<Key, E> >::moveToPos;
    AList<KVpair<Key, E> >::getValue;
};

利用有序表实现的字典:

template <typename Key, typename E>
class SALdict : public Dictionary<Key, E>{
private:
    SAList<Key, E>* list;
public:
    SALdict(int size = defaultSize){
        list = new SAList<Key, E>(size);
    }

    ~SALdict(){}

    //insert一个元素;保证有序
    void insert(const Key& k, const E& e){
        KVpair<Key, E> temp(k, e);
        list->insert(temp);
    }

    //查找将要删除的元素并删除
    E remove(const Key& k){
        E temp = find(k);
        if (temp != NULL)
            list->remove();
        return temp;
    }

    E removeAny(){        //实现为删除最后一个元素
        Assert(size() != 0, "Dictionary is empty");
        list->moveToEnd();
        list->prev();
        KVpair<Key, E> e = list->remove();
        return e.value();
    }

    //查找采用二分查找提高检索效率
    E find(const Key& k) const {
        int l = -1;
        int r = list->length();
        while (l + 1 != r){
            int i = (l + r) / 2;
            list->moveToPos(i);
            KVpair<Key, E> temp = list->getValue();
            if (k < temp.key())
                r = i;
            if (k == temp.key())
                return temp.value();
            if (k > temp.key())
                l = i;
        }
        return NULL;
    }

    int size(){
        return list->length();
    }
};

注:本程序中AList顺序表的实现地址:
http://blog.csdn.net/y396397735/article/details/51513593

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:117842次
    • 积分:3457
    • 等级:
    • 排名:第9612名
    • 原创:234篇
    • 转载:26篇
    • 译文:0篇
    • 评论:5条