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

书籍源码

开发平台:

Visual C++

  1. //【例6.3】顺序表类模板。
  2. #include<iostream>
  3. using namespace std;
  4. template <typename T,int size>class seqlist{
  5. T slist[size];                                     //存放顺序表的数组
  6. int Maxsize;                                       //最大可容纳项数 
  7. int last;                                          //已存表项的最后位置
  8. public:
  9. seqlist(){last=-1;Maxsize=size;}                   //初始化为空表
  10. int Length() const{return last+1;}                 //计算表长度
  11. int Find(T & x)const;                              //寻找x在表中位置(下标)
  12. bool IsIn(T & x);                                  //判断x是否在表中
  13. bool Insert(T & x,int i);                          //x插入到列表中第i个位置处(下标)
  14. bool Remove(T & x);                                //删除x
  15. int Next(T & x);                                   //寻找x的后继位置
  16. int Prior(T & x);                                  //寻找x的前驱位置
  17. bool IsEmpty(){return last==-1;}                   //判断表是否空
  18. bool IsFull(){return last==Maxsize -1;}            //判断表是否满
  19. T Get(int i){                                      //取第i个元素之值
  20. if(i<0||i>last){
  21. cout<<"下标出界!"<<endl;
  22. exit(1);
  23. }
  24. return slist[i];
  25. }
  26. T& operator[](int i);                              //重载下标运算符[]
  27. };
  28. template <typename T,int size> int seqlist<T,size>::Find(T & x)const{
  29.   //注意格式,const表示该函数的this指针为const,即被访问对象的数据不能被修改。
  30.   //如被修改,编译器会警告,防止编程时失误。
  31. int i=0;
  32. while(i<=last && slist[i]!=x) i++;  //顺序查找是否有x 
  33. if (i>last) return -1;              //未找到,返回-1
  34. else return i;                      //找到,返回下标
  35. }
  36. template <typename T,int size> bool seqlist<T,size>::IsIn(T & x){
  37. int i=0;
  38. bool found=0;
  39. while(i<=last && !found)            //换了一种方法来查找
  40. if (slist[i]!=x) i++;
  41. else found=1;                       //找到
  42. return found;
  43. }
  44. template <typename T,int size> bool seqlist<T,size>::Insert(T & x, int i){
  45. int j;
  46. if (i<0||i>last+1||last==Maxsize -1) return false;  //插入位置不合理,不能插入(健壮性)
  47. else{
  48. last++;
  49. for(j=last;j>i;j--) slist[j]=slist[j-1];    //从表最后位置向前依次后移,空出指定位置
  50. slist[i]=x;
  51. return true;
  52. }
  53. }
  54. template <typename T,int size> bool seqlist<T,size>::Remove(T & x){
  55. int i=Find(x),j;                                        //先去找x在哪个位置
  56. if(i>=0){
  57. last--;
  58. for(j=i;j<=last;j++) slist[j]=slist[j+1];         //依次前移,保证表连续
  59. return true;
  60. }
  61. return false;                                         //表中不存在x
  62. }
  63. template <typename T,int size> int seqlist<T,size>::Next(T & x){
  64. int i=Find(x);
  65. if(i>=0 && i<last) return i+1;                        //x后继位置
  66. else return -1;                                       //x不在表中,或在表末尾
  67. }
  68. template <typename T,int size> int seqlist<T,size>::Prior(T & x){
  69. int i=Find(x);
  70. if(i>0 && i<=last)  return i-1;                       //x前驱的位置
  71. else return -1;
  72. }
  73. template <typename T,int size> T& seqlist<T,size>::operator[](int i){
  74. if(i>last||i<0){
  75. cout<<"下标出界!"<<endl;
  76. exit(1);
  77. }
  78. return slist[i];
  79. }
  80. int main(){
  81. seqlist <int,100> seqlisti;                         //顺序表对象seqlisti的元素为整型
  82. int i,j,k,a[10]={2,3,5,7,11,13,17,19,23,29};
  83. for(j=0;j<10;j++)
  84. if (!seqlisti.Insert(a[j],j)){                      //把素数写入
  85. cout<<"数据太多表放不下了!"<<endl;
  86. break;
  87. }
  88. j=seqlisti.Length();
  89. for(i=0;i<j;i++) cout<<seqlisti.Get(i)<<' ';        //打印出seqlisti.slist[]-素数表
  90. cout<<endl ;
  91. for(j=0;j<10;j++) seqlisti[j]=0;                    //采用下标运算符运算
  92. for(j=0;j<10;j++) cout<<seqlisti[j]<<' ';
  93. cout<<endl;
  94. for(j=0;j<10;j++) seqlisti[j]=a[j];
  95. for(j=0;j<10;j++) cout<<seqlisti[j]<<' ';
  96. cout<<endl;
  97. k=7;
  98. if (seqlisti.IsIn(k)) cout<<"素数7在顺序表中"<< endl;
  99. //因形参为引用,所以实参不可用整数常量7
  100. else cout <<"素数7不在顺序表中"<<endl;
  101. k=17;
  102. if (seqlisti.Remove (k)) cout<<"删除素数17"<<endl;  //删除素数17
  103. else cout<<"找不到素数17,无法删除";
  104. j=seqlisti.Length( ) ;
  105. for (i=0;i<j;i++) cout<<seqlisti.Get(i)<<' ';      //打印剩下的素数
  106. cout<<endl;
  107. if (seqlisti.Insert(k,j-1)){                       // 把素数17装回去,成功则打印
  108. j=seqlisti.Length ( );
  109. for (i=0;i<j;i++)  cout<<seqlisti.Get(i)<<' '; 
  110. cout<<endl;
  111. }
  112. cout<<"打印17后一个素数:"<<seqlisti.Get(seqlisti.Next(k)) <<endl;
  113. cout<<"打印17前一个素数:"<<seqlisti.Get(seqlisti.Prior(k))<<endl;
  114. cout<<"素数17在表中位置(下标)为:"<<seqlisti.Find(k)<<endl;
  115. if(seqlisti.IsEmpty( ))  cout<<"表是空的"<<endl;
  116. else cout<<"表不空"<<endl;
  117. if (seqlisti.IsFull())  cout<<"表是满的"<<endl; 
  118. else cout<<"表也不满"<<endl;
  119. if (seqlisti.IsIn(k))  cout<<"素数17在表中"<<endl;
  120. return 0;
  121. }