1、三 概要设计1数据结构设计 本实验以单链表作为集合的数据存储结构,定义三个单链表src1、src2和dest:(1)求并集:先对表src1和src2进行排序,然后比较表src1和src2,将表src1和src2中的元素挨个插入表dest中;(2)求交集:先对表src1和src2进行排序,之后比较表src1、src2,两表中相同的元素逐个插入到表dest中;(3)求差集:先对表src1和src2进行排序,之后比较表src1、src2,将表src1中表src2中没有的元素逐个插入到表dest.2函数的定义和功能(1)创建新集合的函数void CreateSet(Set dest):以程序定义的一个
2、单链表作为参数,从键盘读入数据作为链表的元素;(2)打印集合元素的函数void DisplaySet(Set src):以单链表为参数,使元素逐个输出到屏幕上;(3)排序函数void SortSet(Set dest):对一个单链表进行的排序;(4)长度函数int LengthOf(Set src):对一个链表的结点数目进行确定;(5)判断函数int ExistElem(Set dest, ElemType e):判断元素是否存在此链表当中;(6)追加函数void AddElem(Set dest, ElemType e):对一个链表的末尾追加元素;(7)求并函数void AddSet(Set
3、 dest, Set src1, Set src2):以三个单链表作为参数,将表src1、src2的元素的并集输出到表dest;(8)求交函数void MulSet(Set dest, Set src1, Set src2): 以三个单链表作为参数,将表src1、src2的元素的交集输出到表dest;(9)求差函数void SubSet(Set dest, Set src1, Set src2):以三个单链表作为参数,将表src1、src2的元素的差集集输出到表dest;(10)主函数main():显示主菜单,分别调用求并、交和差函数来满足相应的功能;3模块层次关系本程序包含4个模块:(1)主
4、程序模块: void main() 初始化; do 接受命令; 处理命令; while(“命令”=“退出”); (2)集合单元模块实现集合的抽象数据类型;(3)有序表单元模块实现有序表的抽象数据类型;(4)结点结构单元模块定义有序表的结点结构.四 详细设计1. 链表的创建根据键盘输入的数据创建链表。void CreateSet(Set dest) /创建一个新的集合 ElemType ch; Set p=dest,n; for(;) ch=getchar(); if(ch=n) break; n=(Set)malloc(sizeof(ElemNode); p-next=n; n-elem=ch
5、;next=NULL; p=n; return ;2. 集合的排序使用冒泡排序法进行排序,对链表中的元素从前往后两两之间进行比较,取出最大值之后再进行循环,之后依次取出第二大,第三大.直到链表排序完成,具体代码如下:void SortSet(Set dest) /对一个集合进行从小到大的排序 int i,j,l,flag; Set p,q,n; l=LengthOf(dest); if(l0&flag=1;i-) flag=0; p=dest; q=p-next; n=q- for(j=0;jelemn-elem) q-next=n-next=q; p=q; q=n; n=n-2. 集合的并运
6、算先输入A、B集合的内容和一个空集合,以单链表的形式作为函数void AddSet()的三个实参,再对A、B集合进行排序,通过比较A、B中的元素求出A、B集合中所有的元素,从前往后将A、B中的所有元素逐个插入到表dest中,具体代码如下:void AddSet(Set dest, Set src1, Set src2) /集合并运算 SortSet(src1);SortSet(src2); int i=0,j=0,len1=LengthOf(src1),len2=LengthOf(src2); src1=src1-src2=src2- while(ielem i+; if(!ExistElem
7、(dest, src1-elem) AddElem(dest, src1-elem); else j+;ExistElem(dest, src2- AddElem(dest, src2- src2=src2-len1) while(jelem) i+;src1=src1- else if(src1-elem) j+;j+;4. 集合的差运算将A、B集合的内容和一个空集合,以单链表的形式作为函数void SubSet()的三个实参,再对集合A、B进行排序,通过比较A、B中的元素求出A、B集合差集,从前往后将满足条件的元素逐个插入到表dest中,具体代码如下:void SubSet(Set des
8、t, Set src1, Set src2) /集合差运算 int i=0,len=LengthOf(src1);len)ExistElem(src2, src1-5. 集合的显示将最后得到的链表中的数据进行输出,具体代码如下:void DisplaySet(Set src) /打印集合的所有元素 Set p; if(src-next=NULL) printf(); p=src; do p=p- putchar(p- while(p-next!=NULL);五 调试分析1在对数据进行排序时,由于对循环控制没有做到精确限制,导致输出结果不能按预期递增有序输出,后不断调试和分析后是问题得到正确解决
9、。2最初进行并运算时,总是没有屏蔽重复的数据,最后分析发现:是判断元素是否存在集合中的函数int ExistElem()错误,导致对数据的重复判断失误。3本次课程设计采用链表形式的数据抽象的程序设计方案,将程序化分为四个主要模块,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可用性,确实得到了一次良好的程序设计训练。4在测试求交集运算时,总显示存取错误,经分析分析调试后发现是在void MulSet()函数定义链表时出现错误,对其中一个链表没有初始化,导致数据存取失败。六 测试结果1.集合并运算测试:2.集合交运算测试:3.集合差运算:七 用户使用说明1在进入使用界面后,根据系统提示从键盘输入两组元素到A、B中,元素可以是数字,可以是字母;2根据界面提示选择要进行的集合运算:1.并集、2.交集、3.差集0.退出;3完成操作之后输入“0”退出。八 课程设计总结通过本次课程设计我学习到了很多内容,尤其是对于C+和数据结构中的专业知识有了更深的理解。此程序中尚有一些不足之处,比如缺少循环使用的功能,每次想要更换集合的元素都得重启程序之后才行。在编写代码时也遇到了各种问题,大部分都是自己考虑不全面和经验不足的结果,但在反复思考分析,并请教同学之后,这些问题都得到了有效的解决。这些将为我以后学习提供宝贵的经验。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2