C++ 线性表的实现
1 //线性表的实现,main函数里是所有函数的测试!有兴趣的可以参考!高手请指正~ 2 3 #include <iostream> 4 #include <stdlib.h> 5 #include <cassert> 6 using namespace std; 7 8 const int defaultSize=100; 9 10 template <class T> 11 class Seqlist 12 { 13 protected: 14 T *data; //存放数组,动态表示 15 int maxSize; //最大可以容纳表项的项数,从0开始,其原因在于,数组是从0开始的 16 int last; //当前已经存表项的最后位置 17 void reSize(int newSize); 18 public: 19 Seqlist(int sz=defaultSize); 20 Seqlist(Seqlist<T>& L); //复制构造函数 21 ~Seqlist(){delete[] data;} 22 int Size(){return maxSize;} 23 int Length(){return last+1;} 24 int Locate(T &x); //如果形参表里写(T x),有什么区别呢?//用引用形式比较方便,因为x的形式有可能非常复杂//定义为引用就不可以直接传递一个常数 25 T getData(int i); //第i个表项的值 26 void input(); 27 void print(); 28 bool Remove(int i); 29 bool Remove1(T &x,int i); //位置删除和元素删除,这是不同的!!!但是区别不大啊 30 bool Insert(int i,T &x); //默认插入最后的位置 31 Seqlist<T> operator=(Seqlist<T>& L); //顺序表整体相等 32 void Union(Seqlist<T>& LA,Seqlist<T> &LB); 33 void Intersection(Seqlist<T> &LA,Seqlist<T> &LB); 34 }; //有分号 35 36 template <class T> 37 Seqlist<T>::Seqlist(int sz) //带有形参 38 { 39 if(sz>0) 40 { 41 maxSize=sz; 42 last=-1; 43 data=new T[maxSize]; 44 if(data==NULL) //赋值为NULL,死机 45 { 46 cout<<"存储分配错误"<<endl; 47 exit(1); 48 } 49 } 50 cout<<"这里是构造函数!"<<endl; 51 } 52 53 template <class T> 54 Seqlist<T>::Seqlist(Seqlist<T>& L) //复制构造函数 55 { 56 maxSize=L.Size(); 57 last=L.Length()-1; 58 data=new T[maxSize]; 59 if(data=NULL) 60 { 61 cout<<"存储分配错误!"<<endl; 62 exit(1); 63 } 64 for(int i=0;i<=last+1;i++) 65 data[i-1]=L.getData(i); 66 cout<<"这里是复制构造函数!"<<endl; 67 } 68 69 template <class T> 70 T Seqlist<T>::getData(int i) 71 { 72 if(i<0&&i>last+1) 73 { 74 cout<<"不存在"<<i<<"位置"<<endl; 75 exit(1); 76 } 77 else 78 return data[i-1]; 79 } 80 81 template <class T> 82 void Seqlist<T>::reSize(int newSize) 83 { 84 if(newSize<=0) 85 { 86 cout<<"无效的数组大小"<<endl; 87 exit(1); 88 } 89 if(newSize!=maxSize) 90 { 91 T *newarray=new T[newSize]; 92 if(newarray=NULL) 93 { 94 cout<<"无效的数组大小"<<endl; 95 exit(1); 96 } 97 int n=last+1; 98 T *srcptr=data; 99 T *destptr=newarray; 100 while(n--) //赋值 101 *destptr++=*srcptr++; 102 delete[] data; 103 data=newarray; 104 maxSize=newSize; 105 } 106 } 107 108 template <class T> 109 int Seqlist<T>::Locate(T &x) 110 { 111 for(int i=0;i<=last;i++) 112 { 113 if(data[i]==x) 114 return i+1; 115 } 116 return 0; //没有找到该元素 117 } 118 119 template <class T> 120 bool Seqlist<T>::Insert(int i,T &x) 121 { 122 if(last==maxSize-1) 123 { 124 return false; 125 } 126 if(i<0||i>last) 127 { 128 cout<<"插入的位置不存在!"<<endl; 129 return false; 130 } 131 for(int j=last;j>=i;j--) 132 { 133 data[j+1]=data[j]; 134 data[i]=x; 135 last++; //动态数组,这个是可以扩展的! 136 return true; 137 } 138 } 139 140 template <class T> 141 bool Seqlist<T>::Remove(int i) 142 { 143 if(i<0||i>maxSize-1) 144 { 145 cout<<i<<" 的位置不存在"<<endl; 146 return false; 147 } 148 else 149 { 150 for(int j=i;j<=last;j++) 151 { 152 data[j-1]=data[j]; 153 } 154 last--; 155 return true; 156 } 157 } 158 159 template <class T> 160 void Seqlist<T>::input() 161 { 162 cout<<"开始建立顺序表,请输入表中的元素个数:"<<endl; 163 /** 164 while(1) 165 { 166 cin>>last; 167 if(last<maxSize-1) 168 break; 169 cout<<"表元素个数输入有误,范围不超过"<<maxSize-1<<endl; 170 exit(1); 171 } 172 **/ 173 while(1) //为了实现错误的再输入 174 { 175 //assert(cin>>last); 176 cin>>last; 177 last--; 178 if(last<0) 179 { 180 cout<<"Input Error!"<<endl; 181 cout<<"Input the size again:"<<endl; 182 } 183 else if(last>maxSize-1) //当last>maxSize-1时,对数组进行扩大 184 { 185 cout<<"Input Error!"<<endl; 186 } 187 else 188 break; 189 } 190 cout<<"依次输入表中的元素"<<endl; 191 for(int i=0;i<=last;i++) 192 { 193 194 //assert(cin>>data[i]);//TODO 195 cout<<i+1<<" "; 196 cin >> data[i]; 197 198 } 199 } 200 201 template <class T> 202 void Seqlist<T>::print() 203 { 204 cout<<"顺序表当前元素的最后位置:"<<last<<endl; 205 for(int i=0;i<=last;i++) 206 cout<<"#"<<i+1<<":"<<data[i]<<endl; 207 } 208 209 template <class T> 210 Seqlist<T> Seqlist<T>::operator=(Seqlist<T>& L) 211 { 212 Seqlist<T> list; 213 list.maxSize=L.maxSize; 214 list.last=L.last; 215 T *srcptr=list.data; 216 T *destptr=L.data; 217 int n=last+1; 218 while(n--) 219 *srcptr++ = *destptr++; 220 return list; 221 } 222 223 template <class T> 224 bool Seqlist<T>::Remove1(T &x,int i) 225 { 226 if(i<0||i>maxSize-1) 227 { 228 cout<"要删除的位置不存在"<<endl; 229 return false; 230 } 231 else 232 { 233 for(int j=last;j>=i;j--) 234 { 235 data[j-1]=data[j]; //将该元素所在的位置覆盖就可以啦 236 } 237 last--; 238 return true; 239 } 240 } 241 242 template <class T> 243 void Seqlist<T>::Union(Seqlist<T> &LA,Seqlist<T> &LB) 244 { 245 //合并顺序表LA,LB,将公共元素存于LA中 246 int m=LB.Length(); 247 int n=LA.Length(); 248 int x,k; 249 for(int i=0;i<m;i++) 250 { 251 x=LB.data[i]; //在LB中确定一个元素,如果LA中不存在,那么则加入A中 252 k=LA.Locate(x); 253 if(k==0) 254 { 255 LA.Insert(n,x); 256 n++; 257 } 258 } 259 } 260 261 template <class T> 262 void Seqlist<T>::Intersection(Seqlist<T> &LA,Seqlist<T> &LB) 263 { 264 //在A中确定一个元素,如果在B中找到,则在A中删除TA 265 int n=LA.Length(); 266 int m=LB.Length(); 267 int p,q; 268 for(int j=0;j<n;j++) 269 { 270 p=LA.data[j]; 271 q=LB.Locate(p); 272 if(q!=0) 273 { 274 LA.Remove(q); 275 } 276 } 277 } 278 279 280 int main() //main函数不知道为什么会有一个错误啊。。。。。。。。。。。。。。。。 281 { 282 Seqlist<int> a(10); //这里的初始化很不一样 283 //测试,实现上述所有的功能 284 //输入 285 a.input(); 286 //赋值构造函数应该怎么调用?? 287 //Seqlist<int> b(a); 288 //b.print(); 289 //大小 290 int n; 291 n=a.Size(); 292 cout<<"The size of a is "<<n<<endl; 293 //get函数 294 int m; 295 m=a.getData(4); //获得i位置的元素 296 cout<<"位置4处的元素值为 "<<m<<endl; 297 //length 298 cout<<"The length of the array is "<<a.Length()<<endl; 299 cout<<"The last is"<<a.Length()-1<<endl; 300 //locate 301 int p=3; 302 int lo; 303 lo=a.Locate(p); 304 cout<<"The address of 3 is"<<a.Locate(p)<<endl; //不能直接传递整数 305 cout<<"The last is"<<a.Length()-1<<endl; 306 int t; 307 t=3; 308 a.Remove(lo);//TODO 309 cout<<"After remove 3:"; 310 a.print(); 311 //插入 312 int in=0; 313 a.Insert(3,in); 314 cout<<"插入以后:"<<endl; 315 a.print(); 316 Seqlist<int> b(8); 317 b.input(); 318 for(int i=0;i<80;i++) 319 { 320 cout<<"*"; 321 } 322 cout<<endl; 323 //这函数怎么调用呢? 324 Seqlist<int> c; 325 c.Union(a,b); 326 a.print(); 327 328 for(int i=0;i<80;i++) 329 { 330 cout<<"*"; 331 } 332 cout<<endl; 333 c.Intersection(a,b); 334 a.print(); 335 for(int i=0;i<80;i++) 336 { 337 cout<<"*"; 338 } 339 cout<<endl; 340 return 0; 341 }
这个是简单的线性表的实现,因为最经用到,感觉自己不是很熟悉,就写了一遍的,大家可以瞄瞄,欢迎大神指正!
同时在http://blog.163.com/lmx_863/blog/static/16885526920119884542272/ 也有一份线性表的,写的也是比较清晰的,和我的差不多,大家可以参考一下,实现的功能和实现方式区别都不大的!