集合的并交差运算分析.docx
- 文档编号:6426563
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:22
- 大小:125.67KB
集合的并交差运算分析.docx
《集合的并交差运算分析.docx》由会员分享,可在线阅读,更多相关《集合的并交差运算分析.docx(22页珍藏版)》请在冰豆网上搜索。
集合的并交差运算分析
《数据结构》
课程设计说明书
题目
集合的并交差运算
学号
姓名
指导教师
康懿
日期
2015年7月2日
内蒙古科技大学课程设计任务书
课程名称
数据结构课程设计
设计题目
集合的并交差运算
指导教师
康懿
时间
2013年秋学期第15周至第19周
一、教学要求
1.掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风
二、设计资料及参数
每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。
集合的并交差运算
以链表存储集合,在此基础上完成对集合的操作。
要求设计类(或类模板)来描述集合,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:
v输入、输出集合
v查询集合中的元素
v在集合中进行插入、删除元素
v实现集合的并、交、差运算
并设计主函数测试该类。
三、设计要求及成果
1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
四、进度安排
资料查阅与讨论(1天)
系统分析(2天)
系统的开发与测试(5天)
编写课程设计说明书和验收(2天)
五、评分标准
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
/*退出for循环,就是找到了插入的位置*/
first=first->next;/*无序链表中的节点离开,以便它插入到有序链表中。
*/
if(q==L)L=t;/*插在第一个节点之前*/
elsep->next=t;/*p是q的前驱*/
t->next=q;/*完成插入动作*/
}
4.3.2清除算法的详细设计
voidqingchu(LinkListLa)/*清除链表中相同的元素*/
{
chari,j;
LinkListp,q;
La->next;
p=La;
q=p->next;
while(q)
{i=p->data;
j=q->data;
if(i==j)
{q=p->next;/*删除并释放结点*/
p->next=q->next;
free(q);
}
p=p->next;
q=p->next;
}
}
4.3.3求交集算法的详细设计
voidJiaoji(LinkListLa,LinkListLb,LinkListLc)
{/*求两集合的交集,将结果存入另一个链表中*/
chari,j;
LinkListp,q;
La->next;
Lb->next;
p=La;
q=Lb;
while(p&&q)
{
i=p->data;
j=q->data;
if(i p=p->next; if(i==j) {ListInsert(Lc,1,i);p=p->next;q=q->next;} if(i>j) q=q->next; } ListSort(Lc); printf("A∩B="); ListPrint(Lc); } 4.3.4求并集算法的详细设计 voidbingji(LinkListLa,LinkListLb,LinkListLc) {chari,j;/*求两集合的并集*/ LinkListp,q; La->next; Lb->next; p=La; q=Lb; while(p&&q) { i=p->data; j=q->data; if(i {ListInsert(Lc,1,i);p=p->next;} if(i==j) {ListInsert(Lc,1,i);p=p->next;q=q->next;} if(i>j) {ListInsert(Lc,1,j);q=q->next;} } while(p){i=p->data;ListInsert(Lc,1,i);p=p->next;} while(q){j=q->data;ListInsert(Lc,1,j);q=q->next;} ListSort(Lc); printf("A∪B="); ListPrint(Lc); 4.3.5求差集算法的详细设计 voidchaji(LinkListLa,LinkListLb,LinkListLc) {chari,j; LinkListp,q; La->next; Lb->next; p=La; q=Lb; while(p&&q) {i=p->data; j=q->data; if(i {ListInsert(Lc,1,i);p=p->next;} if(i==j) p=p->next; if(i>j) q=q->next; } while(p){i=p->data;ListInsert(Lc,1,i);p=p->next;} ListSort(Lc); ListPrint(Lc); } 第5章测试 图5.1输入输出AB集合 图5.2对AB集合进行删除操作 图5.3对AB集合进行插入操作 图5.4对AB集合进行并交差操作 第6章总结 在本次数据结构课程设计的过程中,深刻的意识到对程序代码设计的难度,不过这更让我在这过程中受益匪浅,体味到计算机系的高大上。 这个课程具有很高的挑战性和耐性。 进行程序设计的时候注意模块的划分,从各个小模块开始进行设计。 设计的过程中,出现了很多错误,但是通过查找资料,反复对比内容的真伪性,找出了问题的所在,并最终解决了问题,这过程中结果并不显的那么重要,因为有艰辛的过程,所以才显出了结果的完美,它让我更加坚定了在这条路上的努力发展。 附录: 程序代码 #include #include #include #include #include #include #include #include #include #include //函数结果状态代码 #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已存在。 操作结果: 销毁线性表L*/ LinkListq; while(*L) { q=(*L)->next; free(*L); *L=q; } } voidClearList(LinkListL)/*不改变L*/ {/*初始条件: 线性表L已存在。 操作结果: 将L重置为空表*/ LinkListp,q; p=L->next;/*p指向第一个结点*/ while(p)/*没到表尾*/ { q=p->next; free(p); p=q; } L->next=NULL; printf("删除成功\n");/*头结点指针域为空*/ } StatusListEmpty(LinkListL) {/*初始条件: 线性表L已存在。 操作结果: 若L为空表,则返回TRUE,否则返回FALSE*/ if(L->next)/*非空*/ returnFALSE; else returnTRUE; } StatusListInsert(LinkListL,inti,ElemTypee)/*不改变L*/ {/*在带头结点的单链线性表L中第i个位置之前插入元素e*/ intj=0; LinkListp=L,s; while(p&&j { p=p->next; j++; } if(! p||j>i-1)/*i小于1或者大于表长*/ returnERROR; s=(LinkList)malloc(sizeof(structLNode));/*生成新结点*/ s->data=e;/*插入L中*/ s->next=p->next; p->next=s; returnOK; } StatusListDelete(LinkListL,inti,ElemType*e)/*不改变L*/ {/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/ intj=0; LinkListp=L,q; while(p->next&&j { p=p->next; j++; } if(! p->next||j>i-1)/*删除位置不合理*/ returnERROR; q=p->next;/*删除并释放结点*/ p->next=q->next; *e=q->data; free(q); returnOK; } voidListPrint(LinkListL)/*依次输出链表中的元素*/ { LinkListp=L->next; if(! p) printf("空集\n"); while(p) { printf("%c",p->data); p=p->next; } printf("\n"); } voidListSort(LinkListL) { LinkListfirst;/*为原链表剩下用于直接插入排序的节点头指针*/ LinkListt;/*临时指针变量: 插入节点*/ LinkListp;/*临时指针变量*/ LinkListq;/*临时指针变量*/ first=L->next;/*原链表剩下用于直接插入排序的节点链表*/ L->next=NULL;/*只含有一个节点的链表的有序链表。 */ while(first! =NULL)/*遍历剩下无序的链表*/ { /*插入排序*/ for(t=first,q=L;((q! =NULL)&&(q->data /*退出for循环,就是找到了插入的位置*/ first=first->next;/*无序链表中的节点离开,以便它插入到有序链表中。 */ if(q==L)L=t;/*插在第一个节点之前*/ elsep->next=t;/*p是q的前驱*/ t->next=q;/*完成插入动作*/ } } voidqingchu(LinkListLa)/*清除链表中相同的元素*/ { chari,j; LinkListp,q; La->next; p=La; q=p->next; while(q) {i=p->data; j=q->data; if(i==j) {q=p->next;/*删除并释放结点*/ p->next=q->next; free(q); } p=p->next; q=p->next; } } voidzengtian(LinkListLa)/*向集合中添加元素*/ {chara; printf("请输入要增添的元素,加0结束\n"); scanf("%c",&a); while(a! ='0') { if((a>='a'&&a<='z')||(a>='A'&&a<='Z')) { ListInsert(La,1,a);scanf("%c",&a);}}getchar(); /*消除空格*/ ListSort(La); ListPrint(La);} voidJiaoji(LinkListLa,LinkListLb,LinkListLc) {/*求两集合的交集,将结果存入另一个链表中*/ chari,j; LinkListp,q; La->next; Lb->next; p=La; q=Lb; while(p&&q) { i=p->data; j=q->data; if(i p=p->next; if(i==j) {ListInsert(Lc,1,i);p=p->next;q=q->next;} if(i>j) q=q->next; } ListSort(Lc); printf("A∩B="); ListPrint(Lc); } voidbingji(LinkListLa,LinkListLb,LinkListLc) {chari,j;/*求两集合的并集*/ LinkListp,q; La->next; Lb->next; p=La; q=Lb; while(p&&q) { i=p->data; j=q->data; if(i {ListInsert(Lc,1,i);p=p->next;} if(i==j) {ListInsert(Lc,1,i);p=p->next;q=q->next;} if(i>j) {ListInsert(Lc,1,j);q=q->next;} } while(p){i=p->data;ListInsert(Lc,1,i);p=p->next;} while(q){j=q->data;ListInsert(Lc,1,j);q=q->next;} ListSort(Lc); printf("A∪B="); ListPrint(Lc); } voidchaji(LinkListLa,LinkListLb,LinkListLc) {chari,j; LinkListp,q; La->next; Lb->next; p=La; q=Lb; while(p&&q) {i=p->data; j=q->data; if(i {ListInsert(Lc,1,i);p=p->next;} if(i==j) p=p->next; if(i>j) q=q->next; } while(p){i=p->data;ListInsert(Lc,1,i);p=p->next;} ListSort(Lc); ListPrint(Lc); } intmain() {chara; charb;charc; LinkListL1,L2,L3,L4,L5,L6; InitList(&L1); InitList(&L2); InitList(&L3);/*构建需要的链表*/ InitList(&L4); InitList(&L5); InitList(&L6); printf("************************************\n"); printf("欢迎使用集合交并差运算程序\n"); printf("************************************\n"); printf("请输入A集合的元素,加0结束\n"); scanf("%c",&a); while(a! ='0') { if((a>='a'&&a<='z')||(a>='A'&&a<='Z')) { ListInsert(L1,1,a); scanf("%c",&a); } } getchar(); ListSort(L1); qingchu(L1); ListPrint(L1); printf("请输入B集合的元素,加0结束\n"); scanf("%c",&b); while(b! ='0') { if(b>='a'&&b<='z'||b>='A'&&b<='Z') { ListInsert(L2,1,b);scanf("%c",&b); } } getchar(); ListSort(L2); qingchu(L2); ListPrint(L2); printf("请选择你要的操作\n"); printf("1.删除A集合内元素\n"); printf("2.删除B集合内元素\n"); printf("3.添加元素至A集合\n"); printf("4.添加元素至B集合\n"); printf("5.A∩B\n"); printf("6.A∪B\n"); printf("7.A-B\n"); printf("8.B-A\n"); printf("0.结束\n"); do {scanf("%c",&c); getchar(); switch(c) { case'1': ClearList(L1);break; case'2': ClearList(L2);break; case'3': zengtian(L1);break; case'4': zengtian(L2);break; case'5': Jiaoji(L1,L2,L4);break; case'6': bingji(L1,L2,L3);break; case'7': chaji(L1,L2,L5);break; case'8': chaji(L2,L1,L6);break; default: printf("欢迎使用\n"); } } while(c! ='0');}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集合 交差 运算 分析