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

书籍源码

开发平台:

Visual C++

  1. //【例9.5】在【例6.10】中未能重载插入运算符"<<",本例给予改进。
  2. #include<iostream>
  3. using namespace std;
  4. template <typename T>struct Node{
  5. T  key;
  6. // 其他域省略
  7. };//再次指出分号不可少
  8. template <typename T,int size>class Orderedlist{
  9. int maxsize;
  10. int last;
  11. Node<T> slist[size];
  12. public:
  13. Orderedlist(){last=-1;maxsize=size;}
  14. void BubbleSort();
  15. bool Insert(Node<T> & elem,int i);
  16. void print();
  17. // 无关成员函数省略
  18. };//再次指出分号不可少
  19. template <typename T,int size> bool Orderedlist<T,size>::Insert(Node<T> & elem ,int i){
  20. if (i<0||i>last+1||last==maxsize-1) return false;
  21. else{
  22. for (int j=last;j>i;j--) slist[j]=slist[j-1];
  23. slist[i]=elem;
  24. last++;
  25. return true;
  26. }
  27. }
  28. template <typename T,int size> void Orderedlist<T,size>::print(){
  29. int i;
  30. for(i=0;i<=last;i++){
  31. cout<<slist[i].key;
  32. if(i%5==4) cout<<endl;
  33. }
  34. cout<<endl;
  35. }
  36. template <typename T,int size> void Orderedlist<T,size>::BubbleSort(){
  37. bool noswap;
  38. int i,j;
  39. Node<T> temp;
  40. for (i=0;i<last;i++){//最多做n-1趟
  41. noswap=true; //未交换标志为真
  42. for(j=last;j>i;j--){//从下往上冒泡
  43. if(slist[j].key<slist[j-1].key){
  44. temp=slist[j];
  45. slist[j]=slist[j-1];
  46. slist[j-1]=temp;
  47. noswap=false;
  48. }
  49. }
  50. if(noswap) break; //本趟无交换,则终止算法。
  51. }
  52. }
  53. class mystring{
  54. char str[20];
  55. int maxsize;
  56. int last;
  57. public:
  58. mystring(){
  59. last=-1;
  60. maxsize=20;
  61. str[0]='';
  62. }
  63. mystring(char *s){//本例为了简化,健壮性并不好
  64. last=-1;
  65. maxsize=20;
  66. do{
  67. last++;
  68. str[last]=s[last];
  69. }while(s[last]!='');
  70. }
  71. ~mystring(){}
  72.     friend ostream & operator<<(ostream & ,const mystring &);//流类作为形式参数必须是引用
  73. bool operator<(mystring &);
  74. mystring & operator=(char * ms);
  75. };
  76. bool mystring::operator<(mystring & ms){//重载<运算符
  77. int i=0,k;
  78. do{
  79. k=str[i]-ms.str[i];
  80. i++;
  81. }while(k==0&&i<last&&i<ms.last);
  82. if(k<0) return true;
  83. if(i==last&&i!=ms.last) return true;
  84. return false;
  85. }
  86. ostream & operator<<(ostream & s,const mystring & cstr){
  87. return s<<cstr.str<<'t';
  88. }
  89. mystring & mystring::operator=(char * ms){
  90. last=-1;
  91. do{
  92. last++;
  93. str[last]=ms[last];
  94. }while(ms[last]!=''&&last<maxsize-1);
  95. ms[last]='';
  96. return *this;
  97. }
  98. int main(){
  99. const int h=10;
  100. int i;
  101. Orderedlist<mystring,100> ordlist;
  102. char mslist[h][5]={"cat","book","car","zoo","fish","cab","dog","cap","fox","can"};
  103. Node<mystring> n[h];//定义结点数组
  104. for(i=0;i<h;i++)  n[i].key=mslist[i];// 结点数组赋值
  105. for(i=0;i<h;i++)  ordlist.Insert(n[i],i); //建立顺序表
  106. cout<<"未排序表:"<<endl;
  107. ordlist.print();
  108. ordlist.BubbleSort();
  109. cout<<"已排序表:"<<endl;
  110. ordlist.print();
  111. return 0;
  112. }