主要是上一篇博客的一些操作补充,集合运算的交与并
下面代码补充的主要是成员函数的实现,
具体格式以及在类中的声明比较简单,略去不表
直接上代码
1,交运算
template <class T>
int seqlist<T>::length()
{
return last + 1;
}
template<class T>
void inter(seqlist<T>& A, seqlist<T>& B) //在集合a中存,在a中取得元素,在b中比较,如果不写成成员函数,而是一个外部函数
{
int an = A.length();
int bn = B.length();
int i = 0;
while (i < an) //因为是求交集,所以找其中一个集合的长度就够了
{
T& x = A.data[i]; //在a中取得元素
int k = B.search(x); //在b中搜索该元素
if (k == -1) //注意在函数search中如果没有找到是对应-1return
{
A.remove(x); //这里删除的是一个值,不是下标
an--; //下标表长得改一下,否则之后接着查找会下标溢出
}
else
{
i++; //继续寻找下一个,注意此处的i++不能写在上面,因为上面的i出在删除了之后进入了一个新的元素,需要重新比较
}
}
}
2,并运算
template<class T>
void sum(seqlist<T>& A, seqlist<T>& B) //同理也写成一个非成员函数
{
int an = A.length();
int bn = B.length();
int i = 0;
while (i < an) //在集合b中存,在集合a中取得元素(遍历),在集合b中进行比较,在哪里遍历就在哪里作为终点
{
T& x = A.data[i];
int k = B.search(x);
if (k == -1)
{
B.insert(x, i); //如果集合b中没有这个元素,那么把这个元素插入集合b中,在哪里插入无所谓,如果集合b中也有这个元素,那么就不操作
bn++; //同时更新集合b的大小
}
i++; //此处的i++是不需要考虑上交运算一样的顾虑的,因为此时i是在A集合里遍历,而集合A没有变化
}
}
主函数表示
确实在写的时候以前的以及临时改的一些用不上的代码都没有变动,只是单独加了注释隔开,当然有些没用上的语句影响不大的话也就没有修改了
也算是代码比较短的时候懒得修理了,
#include"ex0209.h"
#define endtag 000 //此处预定义000是数字输入结束符号
int main()
{
seqlist<int> A(10), B(10);
int a[5] = { 0,1,76,34,7 }, b[6] = { 7,34,67,23,44,89 };
for (int i = 0; i < 5; i++)
{
A.insert(a[i], i); //没有规律,或者是用随机函数
A.last = i;
}
for (int i = 0; i < 6; i++)
{
B.insert(b[i], i); //没有规律,或者是用随机函数
B.last = i;
}
cout << "原始顺序表A数据" << endl;
for (int i = 0; i <= A.last; i++)
{
cout << A.data[i] << '\t';
}
cout <<endl<< "原始顺序表B数据" << endl;
for (int i = 0; i <= B.last; i++)
{
cout << B.data[i] << '\t';
}
inter(A, B); //其实可以写成运算符重载函数,调用自己也没关系
cout <<endl<< "求交集运算之后顺序表数据" << endl;
for (int i = 0; i <= A.last; i++)
{
cout << A.data[i] << '\t';
}
for (int i = 0; i < 5; i++)
{
A.insert(a[i], i); //这里尝试重新赋值,因为最终对应交集运算的时候是A集合发生了变化,同理如果是并集运算先弄的话,到时候就先对应B集合进行重新赋值
A.last = i;
}
sum(A, B); //在交运算之后改变了值的,在后面会有影响,引用是不能改的,只能重新从头开始赋值,或者是分开运行查看对应的数据
cout <<endl<< "求并集运算之后顺序表数据" << endl;
for (int i = 0; i <= B.last; i++)
{
cout << B.data[i] << '\t';
} //,如何不影响的使得交运算和并运算都能够独立的进行
return 0;
}
主要遇到的问题是如何一次输入数据之后就直接在交集以及并集中进行运算以及输出了,
前面如果用引用的话数据会变,
所以在后面的运算过程中得改变一下,
目前没想到怎么做,
就干脆把数据重新输入了一遍(交集合并集的输入顺序如果变动的话那么只要改动其中的一个,至于哪一个,也是会变的)
最终运行结果图片:
终于知道怎么在文章中把代码片给区别表示出来了,萌新式高兴.jpg