上机试题分析:
#include
using namespace std;
const int MaxSize=100; //100只是示例性的数据,可以根据实际问题具体定义
template //定义模板类SeqList
class SeqList
{
public:
SeqList( ); //无参构造函数
SeqList(T a[], int n); //有参构造函数
~SeqList(); //析构函数为空
int Length(); //求线性表的长度
T
Get(int i); //按位查找,取线性表的第i个元素
int Locate(T x); //按值查找,求线性表中值为x的元素序号
void Insert(int i, T x); //在线性表中第i个位置插入值为x的元素
T
Delete(int i); //删除线性表的第i个元素
void PrintList(); //遍历线性表,按序号依次输出各元素
private:
T
data[MaxSize]; //存放数据元素的数组
int length; //线性表的长度
};
/*
*前置条件:顺序表不存在
*输 入:无
*功 能:构建一个顺序表
*输 出:无
*后置条件:构建一个顺序表
*/
template
SeqList:: SeqList( )
{
length=0;
}
/*
*前置条件:顺序表不存在
*输 入:顺序表信息的数组形式a[],顺序表长度n
*功 能:将数组a[]中元素建为长度为n的顺序表
*输 出:无
*后置条件:构建一个顺序表
*/
template
SeqList:: SeqList(T a[], int n)
{
if
(n>MaxSize) throw “参数非法”;
for
(int i=0; i<n; i++)
data[i]=a[i];
length=n;
}
/*
*前置条件:无
*输 入:无
*功 能:无
*输 出:无
*后置条件:无
*/
template
SeqList:: ~SeqList( )
{
}
/*
*前置条件:顺序表存在
*输 入:插入元素x,插入位置i
*功 能:将元素x插入到顺序表中位置i处
*输 出:无
*后置条件:顺序表插入新元素
*/
template
void SeqList::Insert(int i, T x)
{
int j;
if
(length>=MaxSize) throw “上溢”;
if (i<1 || i>length+1) throw “位置”;
for
(j=length; j>=i; j–)
data[j]=data[j-1]; //注意第j个元素存在数组下标为j-1处
data[i-1]=x;
length++;
}
/*
*前置条件:顺序表存在
*输 入:要删除元素位置i
*功 能:删除顺序表中位置为i的元素
*输 出:无
*后置条件:顺序表删除元素
*/
template
T SeqList::Delete(int i)
{
int x,j;
if
(length==0) throw “下溢”;
if
(i<1 || i>length) throw “位置”;
x=data[i-1];
for
(j=i; j<length; j++)
data[j-1]=data[j]; //注意此处j已经是元素所在的数组下标
length–;
return x;
}
/*
*前置条件:顺序表存在
*输 入:无
*功 能:输出顺序表长度
*输 出:顺序表长度
*后置条件:顺序表不变
*/
template
int SeqList::Length()
{
return length;
}
/*
*前置条件:顺序表存在
*输 入:查询元素位置i
*功 能:按位查找位置为i的元素并输出值
*输 出:查询元素的值
*后置条件:顺序表不变
*/
template
T SeqList::Get(int i)
{
if
(i<1 && i>length) throw “查找位置非法”;
else
return data[i-1];
}
/*
*前置条件:顺序表存在
*输 入:查询元素值x
*功 能:按值查找值的元素并输出位置
*输 出:查询元素的位置
*后置条件:顺序表不变
*/
template
int SeqList::Locate(T x)
{
for (int i=0; i<length; i++)
if (data[i]==x)
return i+1 ; //下标为i的元素等于x,返回其序号i+1
return 0; //退出循环,说明查找失败
}
/*
*前置条件:顺序表存在
*输 入:无
*功 能:顺序表遍历
*输 出:输出所有元素
*后置条件:顺序表不变
*/
template
void SeqList::PrintList()
{
for(int i=0;i<length;i++)
cout<<data[i]<<endl;
}
template
SeqList UnionSet(SeqList
a,SeqList b)
{
T
temp;
for(int i=1;i<=b.Length();i++)
{ temp=b.Get(i);
if(!a.Locate(temp))a.Insert(a.Length()+1,temp);
}
return a;
}
template
SeqList UnionSet1(SeqList
&a,SeqList &b,SeqList &c)
{
T
temp;
for(int i=1;i<=a.Length();i++)
c.Insert(i,a.Get(i));
for(int i=1;i<=b.Length();i++)
{ temp=b.Get(i);
if(!a.Locate(temp))c.Insert(c.Length()+1,temp);
}
return a;
}
#include
using namespace std;
int main( )
{
int ra[]={1,2,3,4,5};
SeqList a(ra,5);
//根据数组创建顺序表
int rb[]={0,1,2,8};
SeqList b(rb,4);
//根据数组创建顺序表
cout<<“Element in a:”<<endl;
a.PrintList(); //输出顺序表a所有元素
cout<<“Element in b:”<<endl;
b.PrintList(); //输出顺序表b所有元素
cout<<“UnionSet1 a and b:”<<endl;
SeqList c;
UnionSet1(a,b,c);
cout<<“Element in UnionSet c:”<<endl;
c.PrintList();
cout<<“UnionSet a and b:”<<endl;
a=UnionSet(a,b);
cout<<“Element in UnionSet a:”<<endl;
a.PrintList(); //输出顺序表a所有元素
}
…
在写这个顺序表程序的时候,前期都是可以明白的,到了要写并集的时候,遇到的第一个问题就是主函数中不知道如何引用前期类函数中各种公共函数,对这方面感觉自己有所欠缺,后面通过老师讲解自己终于也有所了解;遇到的第二个问题是如何通过两个集合实现并集,开始时我并没有想到要用第三个集合,可是发现自己所写程序有些难以解决的问题,最后听了老师的讲解,明白了用第三个集合作为前两个集合的并集集合,前两个A,B集合比较得出并集C的各个元素,相同元素则取其一,不同元素则全取。在写单链表程序求交集时,用相同的方法,取前两个A,B集合的相同元素放在集合C中,通过集合指针长度的限制,完成这个程序