• 数据结构:字典


    1、定义:字典(dictionary)是一些元素的结合。每个元素有一个称作key的域,不同元素的key各不相同。

    其抽象数据类型描述为:

    抽象数据类型Dictionary

    {

    实例:

      具有不同关键字的元素组合

    操作:

      Create():创建一个空字典

      Search(k,x):搜索关键字为k的元素

      Insert(x):插入元素

      Delete(k,x):删除关键字为k的元素

    }

    有重复元素的字典(dictionary with duplicates)与上面定义的字典相似,只是它允许多个元素有相同的关键字。在有重复元素的字典中,在进行搜索和删除时需要一个规则来消除歧义。也就是说,如果要搜索关键字为k的元素,那么在所有关键字为k值得元素中应该返回哪一个。

    字典可以保存在线性序列(e1,e2,e3...)中,既可以用公式化描述的方式,也可以用链表的方式实现。

    2.代码实现:

    节点:

     1 template<typename E,typename K>
     2 class SortedChainNode
     3 {
     4     friend ostream& operator<< <>(ostream&, const SortedChain<E, K>&);
     5     friend class SortedChain < E, K > ;
     6 public:
     7     SortedChainNode():data(0){ link = NULL; }
     8     SortedChainNode(const K& k,const E& x) :data(x),key(k){ link = NULL; }
     9     SortedChainNode<E,K>* getLink()//获取下一个Node
    10     {
    11         if (link)
    12         {
    13             return link;
    14         }
    15         return NULL;
    16     }
    17 private:
    18     E data;
    19     K key;
    20     SortedChainNode<E, K>* link;
    21 };
    View Code

    SortedChain:

      1 template<typename E,typename K>
      2 class SortedChain
      3 {
      4 
      5     friend ostream& operator<< <>(ostream&, const SortedChain<E, K>&);
      6 public:
      7     SortedChain(){ first = NULL; }
      8     SortedChain(const K& k,const E& e)
      9     {
     10         first = new SortedChainNode<E, K>(k, e);
     11     }
     12 
     13     SortedChainNode<E,K>& GetFirst()
     14     {
     15         return *first;
     16     }
     17     virtual ~SortedChain();
     18     bool IsEmpty()const{ return first == NULL; }
     19     int Length() const;
     20     bool Search(const K& k, E& e)const;
     21     SortedChain<E, K>& Delete(const K& k, E& e);
     22     SortedChain<E, K>& Insert(const K& k, const E& e);//允许有重复key
     23     SortedChain<E, K>& DistinctInsert(const K& k,const E& e);//不允许重复
     24 private:
     25     SortedChainNode<E, K>* first;
     26 };
     27 
     28 template<typename E,typename K>
     29 SortedChain<E,K>::~SortedChain()
     30 {
     31     SortedChainNode<E, K>* p = first;
     32     while (first!=NULL)
     33     {
     34         p = first->link;
     35         delete first;
     36         first = p;
     37     }
     38 }
     39 
     40 template<typename E,typename K>
     41 bool SortedChain<E,K>::Search(const K& k, E& e)const
     42 {
     43     SortedChainNode<E, K>* p=first;
     44 
     45     while (p != NULL&&p->key<k)
     46     {
     47         p = p->link;
     48     }
     49 
     50     if (p!=NULL&&p->key==k)
     51     {
     52         e = p->data;
     53         return true;
     54     }
     55 
     56     return false;
     57 }
     58 
     59 template<typename E,typename K>
     60 SortedChain<E,K>& SortedChain<E,K>::Delete(const K& k, E& e)
     61 {
     62     SortedChainNode<E, K>* p = first;
     63     SortedChainNode<E, K>* tp = NULL;
     64     while (p != NULL&&p->key < k)
     65     {
     66         tp = p;
     67         p = p->link;
     68     }
     69 
     70     if (p != NULL&&p->key == k)
     71     {
     72         e = p->data;
     73         if (tp)
     74         {
     75             tp->link = p->link;
     76         }
     77         else
     78             first = p->link;//p是first节点
     79 
     80         delete p;
     81 
     82         return *this;
     83     }
     84 
     85     throw exception("Bad input");//不存在相匹配的元素
     86 }
     87 
     88 template<typename E,typename K>
     89 SortedChain<E,K>& SortedChain<E,K>::Insert(const K& k,const E& e)
     90 {
     91     SortedChainNode<E, K>* p = first;
     92     SortedChainNode<E, K>* tp = NULL;
     93     while (p!=NULL&&p->key<k)
     94     {
     95         tp = p;
     96         p = p->link;
     97     }
     98     
     99     SortedChainNode<E, K>* node = new SortedChainNode<E, K>(k, e);
    100     if (tp)
    101     {
    102         tp->link = node;
    103         node->link = p;
    104     }
    105     else
    106     {
    107         node->link = first;
    108         first = node;
    109 
    110     }
    111 
    112     return *this;
    113 }
    114 
    115 template<typename E, typename K>
    116 SortedChain<E, K>& SortedChain<E, K>::DistinctInsert(const K& k, const E& e)
    117 {
    118     SortedChainNode<E, K>* p = first;
    119     SortedChainNode<E, K>* tp = NULL;
    120     while (p != NULL&&p->key < k)
    121     {
    122         tp = p;
    123         p = p->link;
    124     }
    125 
    126     if (p!=NULL&&p->key==k)
    127     {
    128         p->data = e;
    129         return *this;
    130     }
    131 
    132     SortedChainNode<E, K>* node = new SortedChainNode<E, K>(k, e);
    133     if (tp)
    134     {
    135         tp->link = node;
    136         node->link = p;
    137     }
    138     else
    139     {
    140         node->link = first;
    141         first = node;
    142     }
    143 
    144     return *this;
    145 }
    146 
    147 
    148 template<typename E,typename K>
    149 ostream& operator<<(ostream& output,const SortedChain<E,K>& s)
    150 {
    151     SortedChainNode<E, K>* p = s.first;
    152     while (p!=NULL)
    153     {
    154         output << "key: " << p->key << ' ' << "data: " << p->data << endl;
    155         p = p->getLink();
    156     }
    157     return output;
    158 }
    View Code

    完整:

      1 #ifndef SORTEDCHAIN_H
      2 #define SORTEDCHAIN_H
      3 
      4 #include<iostream>
      5 #include<exception>
      6 using namespace std;
      7 template<typename E,typename K>
      8 class SortedChain;
      9 
     10 
     11 template<typename E,typename K>
     12 class SortedChainNode
     13 {
     14     friend ostream& operator<< <>(ostream&, const SortedChain<E, K>&);
     15     friend class SortedChain < E, K > ;
     16 public:
     17     SortedChainNode():data(0){ link = NULL; }
     18     SortedChainNode(const K& k,const E& x) :data(x),key(k){ link = NULL; }
     19     SortedChainNode<E,K>* getLink()//获取下一个Node
     20     {
     21         if (link)
     22         {
     23             return link;
     24         }
     25         return NULL;
     26     }
     27 private:
     28     E data;
     29     K key;
     30     SortedChainNode<E, K>* link;
     31 };
     32 
     33 
     34 template<typename E,typename K>
     35 class SortedChain
     36 {
     37 
     38     friend ostream& operator<< <>(ostream&, const SortedChain<E, K>&);
     39 public:
     40     SortedChain(){ first = NULL; }
     41     SortedChain(const K& k,const E& e)
     42     {
     43         first = new SortedChainNode<E, K>(k, e);
     44     }
     45 
     46     SortedChainNode<E,K>& GetFirst()
     47     {
     48         return *first;
     49     }
     50     virtual ~SortedChain();
     51     bool IsEmpty()const{ return first == NULL; }
     52     int Length() const;
     53     bool Search(const K& k, E& e)const;
     54     SortedChain<E, K>& Delete(const K& k, E& e);
     55     SortedChain<E, K>& Insert(const K& k, const E& e);//允许有重复key
     56     SortedChain<E, K>& DistinctInsert(const K& k,const E& e);//不允许重复
     57 private:
     58     SortedChainNode<E, K>* first;
     59 };
     60 
     61 template<typename E,typename K>
     62 SortedChain<E,K>::~SortedChain()
     63 {
     64     SortedChainNode<E, K>* p = first;
     65     while (first!=NULL)
     66     {
     67         p = first->link;
     68         delete first;
     69         first = p;
     70     }
     71 }
     72 
     73 template<typename E,typename K>
     74 bool SortedChain<E,K>::Search(const K& k, E& e)const
     75 {
     76     SortedChainNode<E, K>* p=first;
     77 
     78     while (p != NULL&&p->key<k)
     79     {
     80         p = p->link;
     81     }
     82 
     83     if (p!=NULL&&p->key==k)
     84     {
     85         e = p->data;
     86         return true;
     87     }
     88 
     89     return false;
     90 }
     91 
     92 template<typename E,typename K>
     93 SortedChain<E,K>& SortedChain<E,K>::Delete(const K& k, E& e)
     94 {
     95     SortedChainNode<E, K>* p = first;
     96     SortedChainNode<E, K>* tp = NULL;
     97     while (p != NULL&&p->key < k)
     98     {
     99         tp = p;
    100         p = p->link;
    101     }
    102 
    103     if (p != NULL&&p->key == k)
    104     {
    105         e = p->data;
    106         if (tp)
    107         {
    108             tp->link = p->link;
    109         }
    110         else
    111             first = p->link;//p是first节点
    112 
    113         delete p;
    114 
    115         return *this;
    116     }
    117 
    118     throw exception("Bad input");//不存在相匹配的元素
    119 }
    120 
    121 template<typename E,typename K>
    122 SortedChain<E,K>& SortedChain<E,K>::Insert(const K& k,const E& e)
    123 {
    124     SortedChainNode<E, K>* p = first;
    125     SortedChainNode<E, K>* tp = NULL;
    126     while (p!=NULL&&p->key<k)
    127     {
    128         tp = p;
    129         p = p->link;
    130     }
    131     
    132     SortedChainNode<E, K>* node = new SortedChainNode<E, K>(k, e);
    133     if (tp)
    134     {
    135         tp->link = node;
    136         node->link = p;
    137     }
    138     else
    139     {
    140         node->link = first;
    141         first = node;
    142 
    143     }
    144 
    145     return *this;
    146 }
    147 
    148 template<typename E, typename K>
    149 SortedChain<E, K>& SortedChain<E, K>::DistinctInsert(const K& k, const E& e)
    150 {
    151     SortedChainNode<E, K>* p = first;
    152     SortedChainNode<E, K>* tp = NULL;
    153     while (p != NULL&&p->key < k)
    154     {
    155         tp = p;
    156         p = p->link;
    157     }
    158 
    159     if (p!=NULL&&p->key==k)
    160     {
    161         p->data = e;
    162         return *this;
    163     }
    164 
    165     SortedChainNode<E, K>* node = new SortedChainNode<E, K>(k, e);
    166     if (tp)
    167     {
    168         tp->link = node;
    169         node->link = p;
    170     }
    171     else
    172     {
    173         node->link = first;
    174         first = node;
    175     }
    176 
    177     return *this;
    178 }
    179 
    180 
    181 template<typename E,typename K>
    182 ostream& operator<<(ostream& output,const SortedChain<E,K>& s)
    183 {
    184     SortedChainNode<E, K>* p = s.first;
    185     while (p!=NULL)
    186     {
    187         output << "key: " << p->key << ' ' << "data: " << p->data << endl;
    188         p = p->getLink();
    189     }
    190     return output;
    191 }
    192 #endif
    View Code
  • 相关阅读:
    centos下网络的基本配置方法讲解
    win8.1环境下硬盘安装centos6.5双系统
    新人出世
    Docker 仓库管理
    Docker Dockerfile
    Docker image创建之Hello world
    ASP.Net Core 发布到 Centos Docker
    C# 人工智能
    C#使用ML.Net完成人工智能预测
    无监督和有监督算法的区别
  • 原文地址:https://www.cnblogs.com/haoliuhust/p/4420618.html
Copyright © 2020-2023  润新知