简单测试过一下,应该没有问题,如有疏忽,欢迎指正。
1、抽象基类——LinearList.h
#ifndef LinearList_h
#define LinearList_h
template <class T>
class LinearList{
public:
LinearList(){}
virtual ~LinearList(){}
virtual int Length()const = 0;
virtual int Search(T& x)const = 0;
virtual T getData(int i)const = 0;
virtual void setData(int i, T& x) = 0;
virtual bool Insert(int i, T& x) = 0;
virtual bool Remove(int i, T& x) = 0;
virtual bool IsEmpty()const = 0;
virtual void input() = 0;
virtual void output() = 0;
};
#endif /* LinearList_h */
2、具体类——SeqList.h
#ifndef SeqList_h
#define SeqList_h
#include <iostream>
#include "LinearList.h"
const int defaultSize = 100;
template <class T>
class SeqList : public LinearList<T>{
protected:
T *data;
int maxSize;
int last;
void reSize(int newSize);
public:
SeqList(int sz = defaultSize);
SeqList(SeqList<T>& L);
~SeqList(){delete []data;}
int Size()const{return maxSize;}
int Length()const{return last+1;}
int Search(T& x)const;
int Locate(int i)const;
T getData(int i)const{return (i > 0 && i <= last+1) ? data[i-1]:NULL;}
void setData(int i, T& x){if(i > 0 && i <= last+1) data[i-1] = x;}
bool Insert(int i, T& x);
bool Remove(int i, T& x);
bool IsEmpty()const{return (last == -1) ? true:false;}
bool IsFull()const{return (last == maxSize-1) ? true:false;}
void input();
void output();
SeqList<T>& operator=(SeqList<T>& L);
};
#endif /* SeqList_h */
3、具体类SeqList中非内联函数的实现——SeqList.cpp
#include <iostream>
#include <stdio.h>
#include "SeqList.h"
using std::cerr;
using std::endl;
using std::cout;
using std::cin;
template <class T>
SeqList<T>::SeqList(int sz){
if(sz > 0){
maxSize = sz;
last = -1;
data = new T[maxSize];
if(data == NULL){
cerr << "存储分配错误!" << endl;
exit(1);
}
}
}
template <class T>
SeqList<T>::SeqList(SeqList<T>& L){
maxSize = L.Size();
last = L.Length() - 1;
data = new T[maxSize];
if(data == NULL){
cerr << "内存分配错误!" << endl;
exit(1);
}
for(int i = 1; i <= last+1; i++)
data[i - 1] = L.getData(i);
}
template <class T>
void SeqList<T>::reSize(int newSize){
if(newSize <= 0){
cerr << "无效的数组大小" << endl;
return;
}
if(newSize != maxSize){
T* newarray = new T[newSize];
if(newarray == NULL){
cerr << "存储分配错误!" << endl;
exit(1);
}
int n = last+1;
T* srcptr = data;
T* destptr = newarray;
while(n--)
*destptr++ = *srcptr++;
delete []data;
data = newarray;
maxSize = newSize;
}
}
template <class T>
int SeqList<T>:: Search(T &x)const{
for(int i = 0; i <= last; i++)
if(data[i] == x)
return i+1;
return 0;
}
template <class T>
int SeqList<T>::Locate(int i)const{
if(i >= 1 && i <= last+1)
return i-1;
else
return 0;
}
template <class T>
bool SeqList<T>::Insert(int i, T &x){
if(last == maxSize-1)
return false;
if(i < 0 || i > last+1)
return false;
for(int j = last; j >= i; j--)
data[j+1] = data[j];
data[i] = x;
last ++;
return true;
}
template <class T>
bool SeqList<T>::Remove(int i, T &x){
if(last == -1)
return false;
if(i < 1 || i > last+1)
return false;
x = data[i-1];
for(int j = i; j <= last; j++)
data[j-1] = data[j];
last --;
return true;
}
template <class T>
void SeqList<T>::input(){
cout << "开始建立顺序表,请输入表中元素个数:";
while(1){
int a;
cin >> a;
last = a-1;
if(last <= maxSize-1)
break;
cout << "表元素个数输入有误,范围不能超过" << maxSize <<";";
}
cout << "请逐个输入表元素:" << endl;
for(int i = 0; i <= last; i++){
cout << i+1 <<": ";
cin >> data[i];
}
}
template <class T>
void SeqList<T>::output(){
cout << "顺序表当前元素最后位置为:" << last << endl;
for(int i = 0; i <= last; i++)
cout << "#" << i+1 << ":" << data[i] << endl;
}
template <class T>
SeqList<T>& SeqList<T>::operator=(SeqList<T>& L){
if(maxSize < L.Size())
reSize(L.Size());
maxSize = L.Size();
last = L.Length() - 1;
for(int i = 0; i <= last; i++){
data[i] = L.getData(i+1);
}
return *this;
}
4、主函数——main.cpp(简单测试,并实现简单的集合交并)
#include <iostream>
#include "SeqList.cpp"
void Merge(SeqList<int>& LA, SeqList<int>& LB);
void Intersection(SeqList<int>& LA, SeqList<int>& LB);
int main(){
SeqList<int> list1(10);
SeqList<int> list2(5);
SeqList<int> list3(5);
cout << "顺序表list1的最大长度为:" << list1.Size() << endl;
list1.input();
list2.input();
list3.input();
cout << "顺序表list1的长度为:" << list1.Length() << endl;
int x = 100, y = 10;
list1.Insert(2, x);
list1.output();
list1.Remove(3, y);
list1.output();
cout << y << endl;
list2.output();
list2 = list1;
list2.output();
Merge(list1,list3);
list1.output();
Intersection(list2, list3);
list2.output();
return 0;
}
void Merge(SeqList<int>& LA, SeqList<int>& LB){
int n = LA.Length(), m = LB.Length(), i, k, x;
for(i = 1; i <= m; i++){
x = LB.getData(i);
k = LA.Search(x);
if(k == 0){
LA.Insert(n,x);
n ++;
}
}
}
void Intersection(SeqList<int>& LA, SeqList<int>& LB){
int n = LA.Length(), i = 1, k, x;
while(i <= n){
x = LA.getData(i);
k = LB.Search(x);
if(k == 0){
LA.Remove(i,x);
n --;
}
else i ++;
}
}