Ex8_10.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:2k
源码类别:

书籍源码

开发平台:

Visual C++

  1. //【例8.10】通用单链表派生类。首先改造【例7.4】的头文件,不采用模板类,
  2. //而采用虚函数实现多态性,达到通用的目的。
  3. #include "Ex8_10.h"
  4. #include<string>
  5. using namespace std;
  6. class StringObject:public Object{
  7. string sptr;
  8. public:
  9. StringObject();
  10. StringObject(string);
  11. ~StringObject();
  12. bool operator>(Object &);
  13. bool operator!=(Object &);
  14. void Print();
  15. };
  16. StringObject::StringObject(){sptr="";}
  17. StringObject::StringObject(string s){sptr=s;}
  18. StringObject::~StringObject(){cout<<"数据类析构"<<endl;} //自动进一步调用string析构函数
  19. bool StringObject::operator>(Object & obj){//虚函数
  20. StringObject & temp=(StringObject &)obj;//必须转换
  21. return sptr>temp.sptr;
  22. }
  23. bool StringObject::operator!=(Object & obj){//虚函数
  24. StringObject & temp=(StringObject &)obj;//必须转换
  25. return sptr!=temp.sptr;
  26. }
  27. void StringObject::Print(){cout<<sptr<<'t';}//虚函数
  28. int main(){
  29. Node * P1;
  30. StringObject* p;
  31. List list1,list2,list3;
  32. char *a[5]={"dog","cat","bear","sheep","ox"},*sp="cat";
  33. int i;
  34. for(i=0;i<5;i++){
  35. p=new StringObject(a[i]);              //建立数据对象
  36. P1=list1.CreatNode();                  //建立结点
  37. P1->Linkinfo(p);                       //数据对象连接到结点
  38. list1.InsertFront(P1);                 //向前生成list1
  39. p=new StringObject(a[i]);              //将在Node的析构函数中释放
  40. P1=list2.CreatNode();
  41. P1->Linkinfo(p);
  42. list2.InsertRear(P1);                  //向后生成list2
  43. }
  44. list1.PrintList();
  45. cout<<"list1长度:"<<list1.Length()<<endl;
  46. list2.PrintList();
  47. cout<<"要求删除的字符串"cat""<<endl;
  48. p=new StringObject(sp);                    //为了程序的通用性只能多一次转换
  49. P1=list1.Find(*p);
  50. delete p;
  51. if(P1!=NULL){
  52. cout<<"删除cat"<<endl;
  53. P1=list1.DeleteNode(P1);
  54. delete P1;
  55. list1.PrintList();
  56. cout<<"list1长度:"<<list1.Length()<<endl; 
  57. }
  58. else cout<<"未找到"<<endl;
  59. cout<<"清空list1"<<endl;
  60. list1.MakeEmpty();                         //清空list1
  61. list1.PrintList();
  62. for(i=0;i<5;i++){
  63. p=new StringObject(a[i]);
  64. P1=list3.CreatNode();
  65. P1->Linkinfo(p);
  66. list3.InsertOrder(P1);//升序创建list3
  67. }
  68. list3.PrintList();
  69. cout<<"程序结束"<<endl;
  70. return 0;
  71. }