字典:以集合为基础,并支持支持Member,Insert和Remove三种运算的抽象数据类型。
字典是一些元素的集合,每个元素有一个称作关键码的域,不同元素的关键码互不相同
组织方式:线性表,跳表(skip list),散列表(hash table)
线性表
字典是一些元素的集合,每个元素有一个称作关键码的域,不同元素的关键码互不相同
组织方式:线性表,跳表(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;
}