dic_impl.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:4k
开发平台:

MultiPlatform

  1. #include <LEDA/_dictionary.h>
  2. /* a simple dictionary implementation by doubly linked lists */
  3. #include <LEDA/list.h>
  4. class list_dic_pair
  5. {
  6.   friend class dic_impl;
  7.   GenPtr key;
  8.   GenPtr inf;
  9.   public:
  10.   list_dic_pair(GenPtr k=0, GenPtr i=0) { key = k;  inf = i; }
  11.   list_dic_pair(const list_dic_pair& p) { key = p.key; inf = p.inf; }
  12.   LEDA_MEMORY(list_dic_pair)
  13. };
  14. #if !defined(__TEMPLATE_FUNCTIONS__)
  15. // we define dummy I/O and compare routines
  16. void Print(const list_dic_pair&, ostream&)  {}
  17. void Read(list_dic_pair&,istream&) {}
  18. int  compare(const list_dic_pair&,const list_dic_pair&) { return 0; }
  19. LEDA_TYPE_PARAMETER(list_dic_pair)
  20. #endif
  21. class dic_impl {
  22. private:
  23. virtual int  cmp(GenPtr, GenPtr) const = 0;
  24. virtual void clear_key(GenPtr&)  const = 0;
  25. virtual void clear_inf(GenPtr&)  const = 0;
  26. virtual void copy_key(GenPtr&)   const = 0;
  27. virtual void copy_inf(GenPtr&)   const = 0;
  28. /* simple example implementation by a doubly linked list */
  29. list<list_dic_pair> L;
  30. public:
  31.  dic_impl();
  32.  dic_impl(const dic_impl&);
  33.  virtual ~dic_impl();
  34. dic_impl& operator=(const dic_impl&);
  35. GenPtr key(list_item p)  const;
  36. GenPtr inf(list_item p)  const;
  37. list_item item(GenPtr) const;
  38. list_item insert(GenPtr,GenPtr);
  39. list_item lookup(GenPtr)  const;
  40. list_item first_item() const;
  41. list_item next_item(list_item) const;
  42. void    change_inf(list_item,GenPtr);
  43. void    del_item(list_item);
  44. void    del(GenPtr);
  45. void    clear();
  46. int     size()        const;
  47. };
  48. inline dic_impl::dic_impl()  {}
  49. inline dic_impl::~dic_impl() { clear(); }
  50. inline int    dic_impl::size() const            { return L.size(); }
  51. inline GenPtr dic_impl::key(list_item i)  const { return L[i].key; }
  52. inline GenPtr dic_impl::inf(list_item i)  const { return L[i].inf; }
  53. inline list_item dic_impl::item(GenPtr p) const { return list_item(p); }
  54. inline list_item dic_impl::first_item()   const { return L.first(); }
  55. inline list_item dic_impl::next_item(list_item i) const 
  56.                                                 { return L.next_item(i); }
  57. dic_impl::dic_impl(const dic_impl& D) 
  58. { list_item i;
  59.   L = D.L;
  60.   forall_items(i,L) 
  61.   { D.copy_key(L[i].key);
  62.     D.copy_inf(L[i].inf);
  63.    }
  64.  }
  65. dic_impl& dic_impl::operator=(const dic_impl& D)
  66. { if (this == &D) return *this;
  67.   clear(); 
  68.   L = D.L;
  69.   list_item i;
  70.   forall_items(i,L) 
  71.   { D.copy_key(L[i].key);
  72.     D.copy_inf(L[i].inf);
  73.    }
  74.   return *this;
  75.  }
  76. list_item  dic_impl::insert(GenPtr key, GenPtr inf) 
  77. {  list_item i = lookup(key);
  78.    if (i != nil)
  79.      { clear_inf(L[i].inf);
  80.        copy_inf(inf);
  81.        L[i].inf = inf;
  82.        return i;
  83.       }
  84.    else
  85.      { copy_key(key);
  86.        copy_inf(inf);
  87.        return L.push(list_dic_pair(key,inf));
  88.       }
  89. }
  90. list_item  dic_impl::lookup(GenPtr key)  const
  91. { list_item i = L.first(); 
  92.   while (i && L[i].key != key) i = L.succ(i);
  93.   return i;
  94.  }
  95. void    dic_impl::change_inf(list_item i, GenPtr inf)
  96. { clear_inf(L[i].inf);
  97.   copy_inf(inf);
  98.   L[i].inf = inf;
  99.  }
  100. void    dic_impl::del_item(list_item i)
  101. { clear_key(L[i].key);
  102.   clear_inf(L[i].inf);
  103.   L.del(i);
  104. }
  105. void    dic_impl::del(GenPtr key)
  106. { list_item i = lookup(key);
  107.   if (i!=nil) del_item(i);
  108.  }
  109. void    dic_impl::clear() 
  110. { list_item i;
  111.   forall_items(i,L)
  112.   { clear_key(L[i].key);
  113.     clear_inf(L[i].inf);
  114.    }
  115.   L.clear();
  116.  }
  117. main() 
  118.   _dictionary<int,int,dic_impl> D; 
  119.   dic_item it;
  120.   int N = read_int("N = ");
  121.   while (N--)
  122.   { int k = rand_int(1,20);
  123.     it = D.lookup(k);
  124.     if (it == nil) 
  125.        D.insert(k,1);
  126.     else
  127.        D.change_inf(it,D.inf(it)+1);
  128.    }
  129.   forall_items(it,D) 
  130.      cout << string("%3d  # = %2dn",D.key(it),D.inf(it));
  131.  }