f1407.cpp
资源名称:c.rar [点击查看]
上传用户:puke2000
上传日期:2022-07-25
资源大小:912k
文件大小:3k
源码类别:

C#编程

开发平台:

Visual C++

  1. //=====================================
  2. // f1407.cpp
  3. // Using Class Template Specialization
  4. //=====================================
  5. #include<iostream>
  6. using namespace std;
  7. //-------------------------------------
  8. template<typename T>
  9. struct Node{
  10.   Node(const T& d):c(d),next(0),pref(0){}
  11.   T c;
  12.   Node *next, *pref;
  13. };//-----------------------------------
  14. // 以下为基本类模板
  15. template<typename T>
  16. class List{
  17.   Node<T> *first, *last;
  18. public:
  19.   List();
  20.   void add(const T& c);
  21.   void remove(const T& c);
  22.   Node<T>* find(const T& c)const;
  23.   void print()const;
  24.  ~List();
  25. };//-----------------------------------
  26. template<typename T>
  27. List<T>::List():first(0),last(0){}
  28. //-------------------------------------
  29. template<typename T>
  30. void List<T>::add(const T& n){
  31.   Node<T>* p = new Node<T>(n);
  32.   p->next = first;  first = p;
  33.   (last ? p->next->pref : last) = p;
  34. }//------------------------------------
  35. template<typename T>
  36. void List<T>::remove(const T& n){
  37.   Node<T>* p = find(n);
  38.   if(!p) return;
  39.   (p->next ? p->next->pref : last) = p->pref;
  40.   (p->pref ? p->pref->next : first) = p->next;
  41.   delete p;
  42. }//------------------------------------
  43. template<typename T>
  44. Node<T>* List<T>::find(const T& n)const{
  45.   for(Node<T>* p=first; p; p=p->next)
  46.     if(p->c==n) return p;
  47.   return 0;
  48. }//------------------------------------
  49. template<typename T>
  50. List<T>::~List(){
  51.   for(Node<T>* p; p=first; delete p)
  52.     first = first->next;
  53. }//------------------------------------
  54. template<typename T>
  55. void List<T>::print()const{
  56.   for(Node<T>* p=first; p; p=p->next)
  57.     cout<<p->c<<"  ";
  58.   cout<<"n";
  59. }//------------------------------------
  60. class Cat{
  61.   string name;
  62. public:
  63.   Cat(const string& n):name(n){}
  64.   bool operator==(const Cat& c){ return name == c.name; }
  65.   friend ostream& operator<<(ostream& o, const Cat& c){ return o<<c.name; }
  66. };//-----------------------------------
  67. // 以下为模板定做
  68. template<>
  69. class List<Cat>{
  70.   Node<Cat> *first, *last;
  71. public:
  72.   List();
  73.   void add(const Cat& c);
  74.   void remove(const Cat& c);
  75.   Node<Cat>* find(const Cat& c)const;
  76.   void print()const;
  77.  ~List();
  78. };//-----------------------------------
  79. List<Cat>::List():first(0),last(0){}
  80. //-------------------------------------
  81. void List<Cat>::add(const Cat& n){    // 与类模板的成员函数实现上有差异
  82.   if(find(n)) return;
  83.   Node<Cat>* p = new Node<Cat>(n);
  84.   p->next = first;  first = p;
  85.   (last ? p->next->pref : last) = p;
  86. }//------------------------------------
  87. void List<Cat>::remove(const Cat& n){
  88.   Node<Cat>* p = find(n);
  89.   if(!p) return;
  90.   (p->next ? p->next->pref : last) = p->pref;
  91.   (p->pref ? p->pref->next : first) = p->next;
  92.   delete p;
  93. }//------------------------------------
  94. Node<Cat>* List<Cat>::find(const Cat& n)const{
  95.   for(Node<Cat>* p=first; p; p=p->next)
  96.     if(p->c==n) return p;
  97.   return 0;
  98. }//------------------------------------
  99. List<Cat>::~List(){
  100.   for(Node<Cat>* p; p=first; delete p)
  101.     first = first->next;
  102. }//------------------------------------
  103. void List<Cat>::print()const{
  104.   for(Node<Cat>* p=first; p; p=p->next)
  105.     cout<<p->c<<"  ";
  106.   cout<<"n";
  107. }//------------------------------------
  108. int main(){
  109.   List<Cat> cList;
  110.   cList.add(string("alice"));
  111.   cList.add(string("luise"));
  112.   cList.add(string("luise"));
  113.   cList.print();
  114.   List<int> iList;
  115.   iList.add(5);
  116.   iList.add(8);
  117.   iList.add(8);
  118.   iList.print();
  119. }//====================================
  120.