数据结构课程设计集合运算.docx
《数据结构课程设计集合运算.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计集合运算.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构课程设计集合运算
第一章前言
1.1、内容:
实验题目:
编制一个演示集合的并、交和差运算的程序。
需求分析:
1、 本演示程序中,集合的元素限定为小写字母字符[“a”…”z”]。
集合输入的形式为一个以“回车符“为结束标志的字符串,串中字符顺序不限。
2、 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息“之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
3、 程序执行的命令包括:
1) 构造集合1;2)构造在集合2;3)求并集;4)求交集;5)求差集;6)返回;7)结束。
“构造集合1”和“构造集合2”时,需以字符的形式键入集合元素
第二章数据结构设计
2.1、数据结构设计
为了实现上述程序的功能,应以有序链表表示集合。
为此,需要两个抽象数据类型:
有序表和集合。
1、有序表的抽象数据类型定义为:
readdata(pointerhead)
初始条件:
head是以head为头节点的空链表。
操作结果:
生成以head为头节点的非空链表。
pop(pointerhead)
初始条件:
head是以head为头节点的非空链表。
操作结果:
将以head为头节点的链表中数据逐个输出。
2、集合的抽象数据类型定义为:
and(pointerhead1,pointerhead2,pointerhead3)
初始条件:
链表head1、head2、head3已存在
操作结果:
生成一个由head1和head2的并集构成的集合head3。
or(pointerhead1,pointerhead2,pointerhead3)
初始条件:
链表head1、head2、head3已存在
操作结果:
生成一个由head1和head2的交集构成的集合head3。
differ(pointerhead1,pointerhead2,pointerhead3)
初始条件:
链表head1、head2、head3已存在
操作结果:
生成一个由head1和head2的差集构成的集合head3。
3、本程序抱含四个模块:
1) 节点结构单元模块——定义有序表的节点结构;
2) 有序表单元模块——实现有序表的抽象数据类型;
3) 集合单元模块——实现集合获得抽象数据类型;
4)主程序模块:
Voidmain(){
初始化;
do{
接受命令;
处理命令;
}while(“命令”!
=“退出”);
}
第三章算法设计
3.1、算法设计
#include
#include
typedefstructLNode//定义结构体类型指针
{
chardata;
structLNode*next;
}*pointer;
voidreaddata(pointerhead)//定义输入集合函数
{
pointerp;
chartmp;
scanf("%c",&tmp);
while(tmp!
='\n')
{
p=(pointer)malloc(sizeof(structLNode));
p->data=tmp;
p->next=head->next;
head->next=p;
scanf("%c",&tmp);
}
}
voidpop(pointerhead)//定义输出集合函数
{
pointerp;
p=head->next;
while(p!
=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
voidand(pointerhead1,pointerhead2,pointerhead3)//定义集合的并集函数
{
pointerp1,p2,p3;
p1=head1->next;
while(p1!
=NULL)
{
p3=(pointer)malloc(sizeof(structLNode));
p3->data=p1->data;
p3->next=head3->next;
head3->next=p3;
p1=p1->next;
}
p2=head2->next;
while(p2!
=NULL)
{
p1=head1->next;
while((p1!
=NULL)&&(p1->data!
=p2->data))
p1=p1->next;
if(p1==NULL)
{
p3=(pointer)malloc(sizeof(structLNode));
p3->data=p2->data;
p3->next=head3->next;
head3->next=p3;
}
p2=p2->next;
}
}
voidor(pointerhead1,pointerhead2,pointerhead3)//定义集合的交集函数
{
pointerp1,p2,p3;
p1=head1->next;
while(p1!
=NULL)
{
p2=head2->next;
while((p2!
=NULL)&&(p2->data!
=p1->data))
p2=p2->next;
if((p2!
=NULL)&&(p2->data==p1->data))
{
p3=(pointer)malloc(sizeof(structLNode));
p3->data=p1->data;
p3->next=head3->next;
head3->next=p3;
}
p1=p1->next;
}
}
voiddiffer(pointerhead1,pointerhead2,pointerhead3)//定义集合的差集函数
{
pointerp1,p2,p3;
p1=head1->next;
while(p1!
=NULL)
{
p2=head2->next;
while((p2!
=NULL)&&(p2->data!
=p1->data))
p2=p2->next;
if(p2==NULL)
{
p3=(pointer)malloc(sizeof(structLNode));
p3->data=p1->data;
p3->next=head3->next;
head3->next=p3;
}
p1=p1->next;
}
}
voidmain()//主函数
{
intx;
printf("(输入数据,按回车键结束,第一个集合大于第二个集合)\n");
pointerhead1,head2,head3;
head1=(pointer)malloc(sizeof(structLNode));
head1->next=NULL;
head2=(pointer)malloc(sizeof(structLNode));
head2->next=NULL;
head3=(pointer)malloc(sizeof(structLNode));
head3->next=NULL;
printf("请输入集合1:
\n");
readdata(head1);//调用输入集合函数
printf("请输入集合2:
\n");
readdata(head2);//调用输入集合函数
A:
printf("1.并集2.交集3.差集4.结束x.重新运算\n");
do{
printf("请选择序号\n");
scanf("%d",&x);
switch(x)
{
case1:
printf("两集合的并是\n");
and(head1,head2,head3);//调用并集函数
pop(head3);
head3->next=NULL;
break;
case2:
printf("两集合的交是\n");
or(head1,head2,head3);//调用交集函数
pop(head3);
head3->next=NULL;
break;
case3:
printf("两集合的差是\n");
differ(head1,head2,head3);//调用差集函数
pop(head3);
head3->next=NULL;
break;
case4:
break;
default:
gotoA;
}
}while(x!
=4);
}
第四章测试数据及程序运行情况
4.1、测试数据及程序运行情况
运行时提示输入:
输入集合1:
asd
输入集合2:
asf
根据提示输入运算类型:
1.并集2.交集3.差集4.结束x.重新运算
输入1,输出”fasd”
输入2,输出”as”
输入3,输出”d”
输入4,输出”pressanykeytocontinue”(结束)
输入其他数,输出”1.并集2.交集3.差集4.结束x.重新运算”(重新选择运算类型)
下面是运行时的界面(附图):
第五章实验过程中的问题及解决方法
5.1、实验过程中出现的问题及解决方法
1、由于对集合的三种运算的算法推敲不足,在链表类型及其尾指针的设置时出现错误,导致程序低效。
2、刚开始时曾忽略了一些变量参数的标识”&”,使调试程序浪费时间不少。
今后应重视确定参数的变量和赋值属性的区分和标识。
3、开始时输入集合后,程序只能进行一次运算,后来加入switch语句,成功解决了这一难题。
4、该算法并不能排除重复输入相同字符的情况,也不能自动滤去非法字符(如空格、阿拉伯数字等)。
5、本程序的模块划分比较合理,且尽可能的将指针的操作封装在节点和链表的两个模块中,致使集合模块的调试比较顺利。
6、本实习作业采用数据抽象的程序设计方案,将程序化分为四个层次结构,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可用性,确实得到了一次良好的程序设计训练。
参考文献
[1]李云清,杨庆红,揭安全.数据结构(C语言版)[M].北京:
人民邮电大学出版社,2004.6
[2]潘彦.算法设计与分析基础[M].北京:
清华大学出版社,2007.1
[3]肖梦强,曲秀清.软件工程——原理、方法与应用[M].北京:
中国水利水电出版社,2005.10
[4]吕凤翥.C++语言程序设计(第2版)[M].北京:
电子工业出版社,2007.2
[5]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2002.9