1、数据结构课程设计题目: 集合的并、交和差运算的程序组号: 第 11 组 成员: 1任务:编制一个演示集合的并、交和差运算的程序。要求:集合的元素限定为整型数据;用三个子程序分别完成并、交和差运算,并输出结果。1、 需求分析首先对题目分析,编制集合的并、交和差运算的程序需理解集合的并、交和差运算:设A、B 分别为实数域的两个集合,A=1,2,3,4,5,B=1,3,5,71)集合的并运算集合的并运算是找出两个集合所能包含的最大元素个数的集合。即 =1,2,3,4,5,7BAS2)集合的交运算集合的并运算是找出两个集合所能包含的最大元素个数的集合。即 =1, 3, 53)集合的差运算集合的并运算是
2、找出两个集合所能包含的最大元素个数的集合。即 =2,4其次,依据数据结构的知识以线性表的顺序表(存储数据类型和长度)为存储结构,数据元素类型为整型,创建两个顺序表 La 和 Lb 作为集合运算的主体,构建一个辅助顺序表Lc 用来保存集合运算后的结果,最后,依据集合的并、交和差运算设计合理的函数体,分别实现顺序表的创建、初始化、输出元素、并运算、交运算和差运算。使用上述实例运行调试程序,并通过调用输出函数输出运算结果,查看是否准确无误的实现想要的运算结果。2、 概要设计定义数据结构为顺序表,含有两个数据域:整型元素、顺序表长度、空间大小。主函数中引用创建、初始化、并、交、差及输出顺序表的子函数。
3、创建顺序表中,创建一个长度为 100 的顺序表,由于分配的空间相对较大,没有使用追加空间的容错程序。使用交互操作实现对不同的顺序表选择是否立即创建元素。初始化顺序表元素中,使用循环语句依次从终端获取人工输入的元素值。输出顺序表元素中,使用循环语句依次输出元素,并适当控制元素间的间距便于辨认。集合并操作中,先将一个顺序表 La 的内容复制到用于暂存结果的顺序表 Lc 中,再依次对另一顺序表 Lb 的元素经行筛选:若元素存在于 La 中(标记 blog=1)则跳过该元素,继续查看下一个元素,否则将该元素附加到暂存数组 Lc 的尾部。另外添加基本容错能力查看是否能够正确执行完该操作。集合交操作中,先
4、将一个顺序表 La 的内容依次取出与 Lb 顺序表的元素一一对比,若该元素存在于 Lb 中,则将该元素赋值到 Lc 顺序表的表尾(length 位置) ,否则跳过该元素,继续查看下一个元素。另外添加基本容错能力查看是否能够正确执行完该操作。集合差操作中,设计程序差运算为 Lc=La-Lb;先将一个顺序表 La 的内容依次取出与 Lb顺序表的元素一一对比,若该元素不存在于 Lb 中(标记 blog=0) ,则将该元素赋值到 Lc 顺序表的表尾(length 位置) ,继续查看下一个元素,否则跳过该元素,另外添加基本容错能力查看是否能够正确执行完该操作。3、 详细设计#include #inclu
5、de 2#define OVERFLOW -2#define OK 1#define ERROR 0typedef int elemtype;typedef int Status;#define listintsize 100/定义数据结构typedef structelemtype *elem;int length;int listsize;Sqlist;/创建数组的元素Status listinsert(Sqlist *L,int i)elemtype a;printf(“输入元素值:n“);scanf(“%d“,*(L-elem+i)=a;L-length+;return OK;/初始化
6、数组Status initsqlist(Sqlist *L)int i,j,k;L-elem=(elemtype *)malloc(listintsize * sizeof(elemtype);if(!L-elem)return OVERFLOW;L-length=0;L-listsize=listintsize;printf(“是否现在输入元素?n现在输入请按;n稍后输入请按;n“);scanf(“%d“,if(i=2)return OK;else if(i=1)printf(“输入目标数组的元素个数j:nj=“);scanf(“%d“,for(k=0;klength;i+)printf(“
7、%5d“,*(L-elem+i);return OK;/blog=0表示元素只存在于一个数组中/blog=1表示元素同时存在于两个数组中/并操作Status Bing(Sqlist *La,Sqlist *Lb,Sqlist *Lc)int i,j;bool blog=0;for(i=0;ilength;i+)*(Lc-elem+i)=*(La-elem+i);Lc-length+;for(i=0;ilength;i+) for(j=0;jlength;j+)if(*(Lb-elem+i)=*(La-elem+j) blog=1;break;if(blog=0)*(Lc-elem+(Lc-le
8、ngth)=*(Lb-elem+i);Lc-length+;blog=0;if(i=Lb-length)return OK;4elsereturn ERROR;/交操作Status Jiao(Sqlist *La,Sqlist *Lb,Sqlist *Lc)int i,j;bool blog=0;for(i=0;ilength;i+) for(j=0;jlength;j+)if(*(La-elem+i)=*(Lb-elem+j) blog=1;break;if(blog=1)*(Lc-elem+(Lc-length)=*(La-elem+i);Lc-length+;blog=0;if(i=La
9、-length)return OK;elsereturn ERROR;/差操作 Lc=La-LbStatus Cha(Sqlist *La,Sqlist *Lb,Sqlist *Lc)int i,j;bool blog=0;for(i=0;ilength;i+) for(j=0;jlength;j+)if(*(La-elem+i)=*(Lb-elem+j) blog=1;break;if(blog=0)*(Lc-elem+(Lc-length)=*(La-elem+i);Lc-length+;blog=0;5if(i=La-length)return OK;elsereturn ERROR;/
10、主函数int main()/初始定义个数组Sqlist list1,list2,list3;Sqlist *La,*Lb,*Lc;La=Lb=Lc=/创建两个顺序表printf(“下面按操作创建两个数组:n-创建第一个数组La:-n“);initsqlist(La);printf(“n创建的第一个数组La内容为:“);printlist(La);printf(“n-创建第二个数组Lb:-n“);initsqlist(Lb);printf(“n创建的第二个数组La内容为:“);printlist(Lb);/实例运行集合的并操作printf(“nnnnn-初始化预存数组Lc-请按跳过输入元素-n“
11、);initsqlist(Lc);Bing(La,Lb,Lc);printf(“数组La与Lb执行集合并操作后结果为:“);printlist(Lc);/实例运行集合的交操作printf(“nnnnn-初始化预存数组Lc-请按跳过输入元素-n“);initsqlist(Lc);Jiao(La,Lb,Lc);printf(“数组La与Lb执行集合交操作后结果为:“);printlist(Lc);/实例运行集合的差操作printf(“nnnnn-初始化预存数组Lc-请按跳过输入元素-n“);initsqlist(Lc);Cha(La,Lb,Lc);printf(“数组La与Lb执行集合差操作La-
12、Lb结果为:“);printlist(Lc);printf(“n-nnnn“);6return 0;4、 调试分析按照操作提示语:1、按 1 对创建的第一个顺序表 La 赋值,按 5 设置 La 的长度为 5 ,并依次输入 5 个整型数据作为 La 的元素:1 ,2 ,3 ,4 ,52、按 1 对创建的第二个顺序表 Lb 赋值,按 4 设置 La 的长度为 4 ,并依次输入 4 个整型数据作为 La 的元素:1 ,3 ,5 ,7执行如上两步之后终端显示结果如下图:3、按 2 跳过对用于保存运算结果的顺序表 Lc 的赋值,主函数调用并操作子函数和输出元素函数给出运算结果。按 2 跳过对用于保存运
13、算结果的顺序表 Lc 的赋值,主函数调用交操作子函数和输出元素函数给出运算结果。按 2 跳过对用于保存运算结果的顺序表 Lc 的赋值,主函数调用差操作子函数和输出元7素函数给出运算结果。执行完上述操作终端显示如下图:该程序的三个字程序的时间复杂度均为 lengthLbltaO关于程序时间复杂度可以一定程度的缩短如:在每次循环查找中删除相对没有用的元素(并操作中 La 与 Lb 中相同的元素,由于集合元素的互异性可以实现,其他操作可以类比).但相对而言并没有明显的缩短时间.程序中也没有按该想法实现另外程序中设置顺序表的空间大小为 100,假如 La 和 Lb 长度足够,会出现并操作超过空间上限大小,实际运行时应当追加一个判断空间大小是否足够及追加空间的子函数,或设定用于保存运行结果的顺序表空间大小为 La 和 Lb 的长度的大小,即 La.length+Lb.length.关于差操作中,只执行了La-Lb的操作,主函数可以再次调用差操作实现Lb-La的操作更为恰当,即添加语句(在return 0;语句之前)如下:initsqlist(Lc);Cha(La,Lb,Lc);printf(“数组La与Lb执行集合差操作Lb-La结果为:“);printlist(Lc);