数据结构课程设计_集合的并、交和差运算(推荐)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“集合的并交和差运算”。
一、课程题目 集合的并、交和差运算
二、问题描述
功能: 编制一个能演示执行集合的并、交和差运算的程序。
三、基本要求
1)集合的元素限定为小写字母字符【‘a’..‘z’】 2)演示程序以用户和计算机的对话方式执行。
四、测试数据
(1)Set1=”magazine”, Set2=’paper”, Set1∪Set2=”aegimnprz”,Set1∩Set2=”ae”,Set1-Set2=”gimnz”;(2)Set1=”012oper4a6tion89”,Set2=”error data”, Set1∪Set2=”adeinoprt”,Set1∩Set2=”aeort”, Set1-Set2=”inp”.五、算法思想
为了实现上述程序的功能,应以有序链表表示集合。为此,需要两个抽象数据类型:有序表和集合。
1、有序表的抽象数据类型定义为: input(linklist l)初始条件:l是以l为头节点的空链表。操作结果:生成以l为头节点的非空链表。
output(linklist l)初始条件:l是以l为头节点的非空链表。
操作结果:将以l为头节点的链表中数据逐个输出。
2、集合的抽象数据类型定义为: heji(linklist A,linklist B,linklist C)初始条件:链表A、B、C已存在操作结果:生成一个由A和B的并集构成的集合C。jiaoji(linklist A,linklist B ,linklist ,C)初始条件:链表A、B、C已存在操作结果:生成一个由A和B的交集构成的集合C。
六、模块化分 本程序抱含四个模块:
1)节点结构单元模块——定义有序表的节点结构; 2)有序表单元模块——实现有序表的抽象数据类型; 3)集合单元模块——实现集合获得抽象数据类型; 4)主程序模块: Void main(){ 初始化; do{ 接受命令; 处理命令;
}while(“命令”!=“退出”);
}
七、源程序 # include #include #include #include typedef struct node {
}lnode,*linklist;lnode *init_lnode();void input(linklist l);void jiaoji(linklist A,linklist B,linklist C);void heji(linklist A,linklist B,linklist C);void output(linklist l);void main(){ lnode *a,*b,*c;a=init_lnode();b=init_lnode();int data;struct node* next;
c=init_lnode();printf(“求AB集合的交集和并集n”);printf(“请输入A集合的元素:”);input(a);printf(“n请输入B集合的元素:”);input(b);printf(“n输入完成n”);printf(“n按任意键进入主菜单:”);getch();do {
};
printf(“%s”,menu);printf(“n请在0-3中选择:”);scanf(“%d”,&sel);switch(sel){ case 1: char menu[]={“nnn-----☆ 1.交集运算 ☆---------nn”
“---------☆ 2和集运算☆---------nn”
“---------☆3.差集运算 ☆---------nn”
“---------☆ 0.退出 ☆---------nn”
printf(“AB集合的交集是:”);
jiaoji(A,B,C);
output(C);
C->next=NULL;
break;
case 2:
printf(“AB的合集是:”);
heji(A,B,C);output(C);
C->next=NULL;break;case 3:
chaji(A,B,C);
break;
case 0:
} break;}while(sel!=0);}
/*主函数结束*/ /**********初始化函数***************/ lnode * init_lnode(){
lnode *l;
l=(lnode *)malloc(sizeof(lnode));
l->next=NULL;
return l;} /***************录入函数********************/ void input(linklist l){
} /************交集函数*********************/ void jiaoji(linklist A,linklist B,linklist C)lnode *s;int x;scanf(“%d”,&x);while(x!=0){
} s=(lnode *)malloc(sizeof(lnode));s->data=x;s->next=l->next;l->next=s;scanf(“%d”,&x);
{lnode *p,*q,*t;
} /***********输出函数*****************/ void output(linklist l){ lnode *s;s=l->next;p=A->next;while(p!=NULL){
} q=B->next;while((q!=NULL)&&(q->data!=p->data))q=q->next;if((q!=NULL)&&(q->data==p->data)){
} p=p->next;t=(lnode*)malloc(sizeof(lnode));t->data=p->data;t->next=C->next;C->next=t;
while(s!=NULL){printf(“%5d”,s->data);} printf(“n”);} s=s->next;/********并集函数*************************/ void heji(linklist A,linklist B,linklist C){
lnode *p,*q,*t;p=A->next;while(p!=NULL){
} q=B->next;while(q!=NULL){ t=(lnode*)malloc(sizeof(lnode));t->data=p->data;t->next=C->next;C->next=t;p=p->next;
} p=A->next;while((p!=NULL)&&(p->data!=q->data))
p=p->next;if(p==NULL){
} q=q->next;t=(lnode*)malloc(sizeof(lnode));t->data=q->data;t->next=C->next;C->next=t;/*********************差集函数****************/ void chaji(linklist A,linklist B, linklist C){ lnode *p,*q,*s,*t;
p=A->next;
printf(“A与B的差集是:n”);while(p!=NULL){ q=B->next;while((q!=NULL)&&(p->data!=q->data))
} q=q->next;if(q==NULL){
} p=p->next;s=(lnode*)malloc(sizeof(lnode));s->data=p->data;s->next=C->next;C->next=s;output(C);C->next=NULL;
q=B->next;
printf(“B与A的差集是:n”);while(q!=NULL){
p=A->next;while((p!=NULL)&&(p->data!=q->data))p=p->next;if(p==NULL){ t=(lnode*)malloc(sizeof(lnode));
}
}
} t->data=q->data;t->next=C->next;C->next=t;q=q->next;output(C);}
四、测试数据及程序运行情况
程序运行结果:
八、心得体会
1、由于对集合的三种运算的算法推敲不足,在链表类型及其尾指针的设置时出现错误,导致程序低效。
2、刚开始时曾忽略了一些变量参数的标识”&”,使调试程序浪费时间不少。今后应重视确定参数的变量和赋值属性的区分和标识。
3、开始时输入集合后,程序只能进行一次运算,后来加入switch语句,成功解决了这一难题。
4、该算法并不能排除重复输入相同字符的情况,也不能自动滤去非法字符(如空格、阿拉伯数字等)。
5、本程序的模块划分比较合理,且尽可能的将指针的操作封装在节点和链表的两个模块中,致使集合模块的调试比较
顺利。
6、本实习作业采用数据抽象的程序设计方案,将程序化分为四个层次结构,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可用性,确实得到了一次良好的程序设计训练。