集合的并交差运算分析Word文档下载推荐.docx
- 文档编号:19439563
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:22
- 大小:125.67KB
集合的并交差运算分析Word文档下载推荐.docx
《集合的并交差运算分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《集合的并交差运算分析Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
五、评分标准
1.根据平时上机考勤、表现和进度,教师将每天点名和检查
2.根据课程设计完成情况,必须有可运行的软件。
3.根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。
4.根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问
六、建议参考资料
1.《数据结构(C语言版)》严蔚敏、吴伟民主编清华大学出版社2004.11
2.《数据结构课程设计案例精编(用C/C++描述)》,李建学等编著,清华大学出版社2007.2
3.《数据结构:
用面向对象方法与C++语言描述》,殷人昆主编,
清华大学出版社2007
第1章需求分析
1、
本演示程序中,集合的元素限定为小写字母字符[“a”…”z”]。
集合输入的形式为一个以“0“为结束标志的字符串,串中字符顺序不限。
2、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息“之后,由用户在键盘上输入演示程序中规定的运算命令;
相应的输入数据和运算结果显示在其后。
3、
程序执行的命令包括:
1)
构造集合A;
2)构造在集合B;
3)删除集合A内的元素;
4)删除集合B内的元素;
5)
在集合A中插入元素;
6)在集合B中插入元素;
7)求AB集合的并集;
8)求AB集合的交集;
9)求AB及BA的差集
第2章总体设计
总体设计框架图,如图2.1所示:
图2.1总体设计框架
第3章抽象数据类型定义
定义格式如下:
3.1LinkList抽象数据类型的设计
ADTLinkList
基本操作:
InitList(LinkList*L)
构造一个空的线性表L
DestroyList(LinkList*L)
初始条件:
线性表L已存在
ListEmpty(LinkListL)
线性表L已存在。
操作结果:
若L为空表,则返回TRUE,否则返回FALSE
StatusListInsert(LinkListL,inti,ElemTypee)
在带头结点的单链线性表L中第i个位置之前插入元素e
ListPrint(LinkListL)
依次输出链表中的元素
3.2集合抽象数据类型的设计
typedefstructLNode
{
chardata;
structLNode*next;
}LNode,*LinkList;
第4章详细设计
4.1工程视图
图4.1工程视图
4.2类图视图
图4.2类图视图
4.3主要算法的详细设计
4.3.1插入算法的详细设计
voidListSort(LinkListL)
{
LinkListfirst;
/*为原链表剩下用于直接插入排序的节点头指针*/
LinkListt;
/*临时指针变量:
插入节点*/
LinkListp;
/*临时指针变量*/
LinkListq;
first=L->
next;
/*原链表剩下用于直接插入排序的节点链表*/
L->
next=NULL;
/*只含有一个节点的链表的有序链表。
*/
while(first!
=NULL)/*遍历剩下无序的链表*/
/*插入排序*/
for(t=first,q=L;
((q!
=NULL)&
&
(q->
data<
t->
data));
p=q,q=q->
next);
/*无序节点在有序链表中找插入的位置*/
/*退出for循环,就是找到了插入的位置*/
first=first->
/*无序链表中的节点离开,以便它插入到有序链表中。
if(q==L)L=t;
/*插在第一个节点之前*/
elsep->
next=t;
/*p是q的前驱*/
t->
next=q;
/*完成插入动作*/
}
4.3.2清除算法的详细设计
voidqingchu(LinkListLa)/*清除链表中相同的元素*/
chari,j;
LinkListp,q;
La->
p=La;
q=p->
while(q)
{i=p->
data;
j=q->
if(i==j)
{q=p->
/*删除并释放结点*/
p->
next=q->
free(q);
}
p=p->
q=p->
4.3.3求交集算法的详细设计
voidJiaoji(LinkListLa,LinkListLb,LinkListLc)
{/*求两集合的交集,将结果存入另一个链表中*/
chari,j;
LinkListp,q;
La->
Lb->
p=La;
q=Lb;
while(p&
q)
i=p->
if(i<
j)
{ListInsert(Lc,1,i);
q=q->
if(i>
q=q->
ListSort(Lc);
printf("
A∩B="
);
ListPrint(Lc);
4.3.4求并集算法的详细设计
voidbingji(LinkListLa,LinkListLb,LinkListLc)
{chari,j;
/*求两集合的并集*/
Lb->
q=Lb;
while(p&
p=p->
{ListInsert(Lc,1,j);
while(p){i=p->
ListInsert(Lc,1,i);
while(q){j=q->
ListInsert(Lc,1,j);
A∪B="
ListPrint(Lc);
4.3.5求差集算法的详细设计
voidchaji(LinkListLa,LinkListLb,LinkListLc)
{chari,j;
{i=p->
if(i<
{ListInsert(Lc,1,i);
if(i==j)
if(i>
while(p){i=p->
ListSort(Lc);
第5章测试
图5.1输入输出AB集合
图5.2对AB集合进行删除操作
图5.3对AB集合进行插入操作
图5.4对AB集合进行并交差操作
第6章总结
在本次数据结构课程设计的过程中,深刻的意识到对程序代码设计的难度,不过这更让我在这过程中受益匪浅,体味到计算机系的高大上。
这个课程具有很高的挑战性和耐性。
进行程序设计的时候注意模块的划分,从各个小模块开始进行设计。
设计的过程中,出现了很多错误,但是通过查找资料,反复对比内容的真伪性,找出了问题的所在,并最终解决了问题,这过程中结果并不显的那么重要,因为有艰辛的过程,所以才显出了结果的完美,它让我更加坚定了在这条路上的努力发展。
附录:
程序代码
#include<
string.h>
ctype.h>
malloc.h>
//malloc()等
limits.h>
//INT_MAX等
stdio.h>
//EOF(=^Z或F6),NULL
stdlib.h>
//atoi()
io.h>
//eof()
math.h>
//floor(),ceil(),abs()
process.h>
//exit()
iostream>
//cout,cin
//函数结果状态代码
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
//#defineOVERFLOW-2因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedefintStatus;
//Status是函数的类型,其值是函数结果状态代码,如OK等
typedefintBoolean;
//Boolean是布尔类型,其值是TRUE或FALSE
typedefintElemType;
/*线性表的单链表存储结构*/
typedefstructLNode
chardata;
structLNode*next;
}LNode,*LinkList;
LinkListh;
/*带有头结点的单链表的基本操作*/
voidInitList(LinkList*L)
{/*操作结果:
构造一个空的线性表L*/
*L=(LinkList)malloc(sizeof(LNode));
/*产生头结点,并使L指向此头结点*/
if(!
*L)/*存储分配失败*/
exit(OVERFLOW);
(*L)->
next=NULL;
/*指针域为空*/
voidDestroyList(LinkList*L)
{/*初始条件:
销毁线性表L*/
while(*L)
q=(*L)->
free(*L);
*L=q;
voidClearList(LinkListL)/*不改变L*/
将L重置为空表*/
p=L->
/*p指向第一个结点*/
while(p)/*没到表尾*/
free(p);
p=q;
printf("
删除成功\n"
/*头结点指针域为空*/
StatusListEmpty(LinkListL)
若L为空表,则返回TRUE,否则返回FALSE*/
if(L->
next)/*非空*/
returnFALSE;
else
returnTRUE;
StatusListInsert(LinkListL,inti,ElemTypee)/*不改变L*/
{/*在带头结点的单链线性表L中第i个位置之前插入元素e*/
intj=0;
LinkListp=L,s;
j<
i-1)/*寻找第i-1个结点*/
j++;
p||j>
i-1)/*i小于1或者大于表长*/
returnERROR;
s=(LinkList)malloc(sizeof(structLNode));
/*生成新结点*/
s->
data=e;
/*插入L中*/
next=p->
p->
next=s;
returnOK;
StatusListDelete(LinkListL,inti,ElemType*e)/*不改变L*/
{/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/
LinkListp=L,q;
while(p->
next&
j<
i-1)/*寻找第i个结点,并令p指向其前岖*/
next||j>
i-1)/*删除位置不合理*/
*e=q->
free(q);
voidListPrint(LinkListL)/*依次输出链表中的元素*/
LinkListp=L->
p)
空集\n"
while(p)
%c"
p->
data);
p=p->
\n"
voidListSort(LinkListL)
voidzengtian(LinkListLa)/*向集合中添加元素*/
{chara;
请输入要增添的元素,加0结束\n"
scanf("
&
a);
while(a!
='
0'
)
if((a>
a'
a<
z'
)||(a>
A'
Z'
))
ListInsert(La,1,a);
}}getchar();
/*消除空格*/
ListSort(La);
ListPrint(La);
voidJiaoji(LinkListLa,LinkListLb,LinkListLc)
intmain()
charb;
charc;
LinkListL1,L2,L3,L4,L5,L6;
InitList(&
L1);
L2);
L3);
/*构建需要的链表*/
L4);
L5);
L6);
************************************\n"
欢迎使用集合交并差运算程序\n"
请输入A集合的元素,加0结束\n"
ListInsert(L1,1,a);
getchar();
ListSort(L1);
qingchu(L1);
ListPrint(L1);
请输入B集合的元素,加0结束\n"
b);
while(b!
if(b>
b<
||b>
ListInsert(L2,1,b);
ListSort(L2);
qingchu(L2);
ListPrint(L2);
请选择你要的操作\n"
1.删除A集合内元素\n"
2.删除B集合内元素\n"
3.添加元素至A集合\n"
4.添加元素至B集合\n"
5.A∩B\n"
6.A∪B\n"
7.A-B\n"
8.B-A\n"
0.结束\n"
do
{scanf("
c);
getchar();
switch(c)
case'
1'
:
ClearList(L1);
break;
2'
ClearList(L2);
3'
zengtian(L1);
4'
zengtian(L2);
5'
Jiaoji(L1,L2,L4);
6'
bingji(L1,L2,L3);
7'
chaji(L1,L2,L5);
8'
chaji(L2,L1,L6);
default:
欢迎使用\n"
while(c!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集合 交差 运算 分析