集合的运算课程设计报告Word文档格式.docx
《集合的运算课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《集合的运算课程设计报告Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
(1)功能
使用链表来表示集合,完成集合的合并,求交集等操作
(2)实施
1)初步完成总体设计,搭好框架,确定函数个数;
2)完成最低要求;
3)继续完成进一步要求。
2、设计的要求
(1)界面友好,函数功能要划分好;
(2)总体设计应画流程图;
(3)程序要加必要的注释;
(4)要提供程序测试方案;
(5)程序要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
二、概要设计
1、问题分析
该问题主要实现以下功能:
(1)利用尾插法建立单链表;
(2)对于输入的链表进行有序排列
(3)删除有序链表中不符合要求的元素
(4)调用函数对单链表进行交、并运算并输出
2、模块结构
(1)结构分析
程序以用户和计算机的对话方式执行,即在计算及终端显示提示信息之后,由用户在键盘输入演示程序中规定的运算命令;
相应的输入数据(过滤输入中的非法字符)和运算结果闲时间在其后。
系统由以下几个模块组成,分别是:
1)单链表的建立
2)单链表的有序排列
3)删除单链表中不符合条件的元素
4)集合交集
5)集合并集
6)单链表输出
7)主函数
(2)结构分析图
主函数
main()
)
(\
创建链表
LinkList*
求交集
voidjiao()
<
J
求并集
voidbing()
JJ
单链表二口点类型
typedefstruct
LNode丿
比较并保存相冋
兀素while语句
丿
r、
删除重复的元素
voidshangchu()
l丿
三、详细设计
1、解题思路
(1)数据结构设计
创建三个带头结点的单链表,用来存储两个集合中的元素和最终的结果为实现集合的交、并运算功能,应以有序链表表示集合。
为此,需要两个抽象数据类型:
有序表和集合。
(2)逻辑结构存储结构
逻辑结构:
创造一个带结点的单链表包括(头结点L、结点若干、尾结
点);
单链表中每个结点包括(*next表示指针data表示域)
2、算法设计
程序执行的命令包括:
(1)定义单链表结点类型typedefstructLNode
(2)运用尾插法建立单链表voidCreatListR(LinkList*&
L,ElemTypea[],intn)
(3)创建头结点,为头结点分配空间
(4)创建新结点
(5)建立有序链表voidSort(LinkList*&
head)
(6)将两个集合的元素进行比较while语句
(7)删除有序链表中的重复元素voidshanchu(LinkList*&
head)
(8)求交集voidjiao(structLnode**L1,structLnode**L2,structLnode**L3)
(9)求并集voidbing(structLnode**L1,structLnode**L2,
structLnode**L3)
(10)输出单链表voidDisplay(LinkList*L)
四、调试分析和测试结果
1、模块分析
(1)定义单链表结点类型
typedefstructLNode
{ElemTypedata;
structLNode*next;
}LinkList;
(2)运用尾插法建立单链表
voidCreatListR(LinkList*&
L,ElemTypea[],intn)
{LinkList*s,*r;
intI;
L=(LinkList*)malloc(sizeof(LinkList));
//创建并为头结点分配空
间
L->
next=NULL;
r=L;
for(i=0;
i<
n;
i++)
{s=(LinkList*)malloc(sizeof(LinkList));
//创建新结点
s->
data=a[i];
r->
next=s;
r=s;
}
next=NULL;
//尾结点指向空
(3)建立有序链表
voidSort(LinkList*&
{LinkList*p=head->
next,*q,*r;
if(p!
=NULL)
{r=p->
next;
p_>
p=r;
while(p!
=NULL)〃后续元素与第一个元素进行比较
q=head;
while(q->
next!
=NULL&
&
q->
next->
data<
p->
data)
q=q->
p->
next=q->
q->
next=p;
p=r;
}
2、结果分析
选择数字1,进行排序输出;
萇台1:
akjiuugdc
集合4黒集合交集氛求集合昇集陆选择■运畀■:
7选謔由)1庖序1集□:
acdgijkuu有厅2集otabefghl怙徙择塾:
(选0退岀)■
选择数字2,输出集合1与集合2的交集;
选择数字3,输出集合1与集合2的并集
■_C:
\USERS\ADM】NISTRATO氐PC*20121124UJXPtDESKTOP\...
akjiuugd冃険入墓合2:
abcfghiL二諭出看痩集合屮战集合交集氛求集合并篥賣疣择三算:
(选0退由)1旬J丄隼合:
acdgijkuu肓序空集^sabcfghl歹4箜算:
(选0退岀)2書還揖誉囂(选0退岀)■
可以看出,该程序成功是实现了集合的排序和两个集合的交集运算,而两个集合的并集运算显然还存在问题,在以后的学习与操作中,我们要更加注重程序的运行,尽量做到零问题出现。
五、总结
1、解决的问题
(1)集合的运算算法
由于对集合的两种运算的算法推敲不足,在链表类型及其尾指针的设置
时出现错误,导致程序低效
刚开始时曾忽略了一些变量参数的标识”&
”,使调试程序浪费时间不少。
今后应重视确定参数的变量和赋值属性的区分和标识。
(2)解决方式
开始时输入集合后,程序只能进行一次运算,后来加入switch语句,成功解决了这一难题。
本程序的模块划分比较合理,且尽可能的将指针的操作封装在节点和链表的两个模块中,致使集合模块的调试比较顺利。
2、心得体会
通过实践才发现程序设计的掌握直接关系到上机实验效果。
对各个知识点的熟练掌握是在课程中理解理论算法和完成上机实验的重要保证。
本课程
设计采用数据抽象的程序设计方案,将程序化分为四个层次结构,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可用性,确实得到了一次良好的程序设计训练。
六、参考文献(资料不得少于5篇)
[1]催俊凯。
计算机软件基础。
机械工业出版社。
2007.7
[2]唐发根。
数据结构教程(第二版)。
北京航空航天大学出版社。
2005.5.
[3]严尉敏,吴伟民.数据结构(C语言版)[M].清华大学出版社,2011年11月
[4]谭浩强。
C程序设计(第三版)。
清华大学出版社。
2005.
[5]李建学,李光元,吴春芳。
数据结构课程设计案例精编(用C/C++描述)。
北京:
2007.2
[6]王宏生,宋继红。
数据结构。
国防工业出版社,2006.1
七、致谢
感谢辅导我们的老师在这个学期细心耐心的指导我们的基础课学习,为我们
的课程设计打下良好的基础。
在这次课程设计中,代老师给我很多的指导和帮助,
让我能够使程序正常运行且实现实验的要求。
八、附录(含程序源码)
#include<
iostream>
malloc.h>
usingnamespacestd;
typedefcharElemType;
typedefstructLNode//定义单链表结点类型
}LinkList;
voidCreatListR(LinkList*&
L,ElemTypea[],intn)//运用尾插法建立单链表
{LinkList*s,*r;
inti;
L=(LinkList*)malloc(sizeof(LinkList));
//创建头结点,为头结点分
配空间
//r先指向头结点后指向尾结点,开始时指针指向头结点for(i=0;
i<
n;
{s=(LinkList*)malloc(sizeof(LinkList));
//创建新结点
next=NULL;
〃尾结点指向空
voidSort(LinkList*&
head)//建立有序链表
{LinkList*p=head->
next,*q,*r;
if(p!
p=r;
voidshanchu(LinkList*&
head)//删除有序链表中重复的元素及非小写字母的元素
next,*r=head,*q,*f;
while(p->
next)
{if(p->
data==p->
data||((p->
data>
'
z'
)||(p->
a'
)))
{q=p->
free(q);
else
p=p->
if(r->
||r->
)
{f=r->
next=f->
free(f);
voidbing(LinkList*ha,LinkList*hb,LinkList*he)//求并集he
{LinkList*pa,*pb,*pe;
pa=ha->
while(pa!
{pe=(LinkList*)malloe(sizeof(LinkList));
pe->
data=pa->
data;
pe->
next=he->
he->
next=pe;
pa=pa->
pb=hb->
while(pb!
{pa=ha->
while((pa!
=NULL)&
(pa->
data!
=pb->
data))pa=pa->
if(pa==NULL)
data=pb->
pc->
hc->
pb=pb->
voidjiao(LinkList*ha,LinkList*hb,LinkList*&
he)//求交集he
{LinkList*pa=ha->
next,*pb,*s,*te;
hc=(LinkList*)malloc(sizeof(LinkList));
//定义he的头结点tc=hc;
while(pa)
{pb=hb->
while(pb&
pb->
pa->
if(pb&
data==pa->
{s=(LinkList*)malloc(sizeof(LinkList));
tc->
tc=s;
voidcha(LinkList*ha,LinkList*hb,LinkList*&
hc)//求差集hc
next,*pb,*s,*tc;
//定义hc的头结点tc=hc;
if(!
(pb&
data))
{s=(LinkList*)malloc(sizeof(LinkList));
voidDispList(LinkList*L)〃输出单链表L
{LinkList*p=L->
next;
{cout<
cout«
endl;
intmain()
{LinkList*ha,*hb,*hc;
ElemTypea[100],b[100];
〃建立两个数组存储集合
intla,lb,x;
cout<
"
请输入集合1:
"
;
cin.getline(a,100);
请输入集合2:
cin.getline(b,100);
la=strlen(a);
lb=strlen(b);
CreatListR(ha,a,la);
CreatListR(hb,b,lb);
Sort(ha);
Sort(hb);
shanchu(ha);
4.求集合并
shanchu(hb);
cout<
1.输出有序集合2.求集合交集3.求集合并集
集"
while(x!
=O)
{//循环对运算的选择
coutvv"
请选择运算:
(选0退出)
cin>
>
x;
switch(x)
{case1:
有序1集合:
DispList(ha);
有序2集合:
DispList(hb);
//输出有序集合
break;
case2:
jiao(ha,hb,hc);
交集合:
DispList(hc);
//调用求交集函数
case3:
bing(ha,hb,hc);
并集合:
//调求用并集函数
case4:
cha(ha,hb,hc);
差集合:
//调用求差集函数
return0;