集合的并交差运算分析.docx

上传人:b****6 文档编号:6426563 上传时间:2023-01-06 格式:DOCX 页数:22 大小:125.67KB
下载 相关 举报
集合的并交差运算分析.docx_第1页
第1页 / 共22页
集合的并交差运算分析.docx_第2页
第2页 / 共22页
集合的并交差运算分析.docx_第3页
第3页 / 共22页
集合的并交差运算分析.docx_第4页
第4页 / 共22页
集合的并交差运算分析.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

集合的并交差运算分析.docx

《集合的并交差运算分析.docx》由会员分享,可在线阅读,更多相关《集合的并交差运算分析.docx(22页珍藏版)》请在冰豆网上搜索。

集合的并交差运算分析.docx

集合的并交差运算分析

 

《数据结构》

课程设计说明书

 

题目

集合的并交差运算

学号

姓名

指导教师

康懿

日期

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->datadata));p=q,q=q->next);/*无序节点在有序链表中找插入的位置*/

/*退出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//malloc()等

#include//INT_MAX等

#include//EOF(=^Z或F6),NULL

#include//atoi()

#include//eof()

#include//floor(),ceil(),abs()

#include//exit()

#include//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已存在。

操作结果:

销毁线性表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->datadata));p=q,q=q->next);/*无序节点在有序链表中找插入的位置*/

/*退出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');}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1