数据结构课程设计报告集合的交并差运算.docx
- 文档编号:29036885
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:27
- 大小:184.84KB
数据结构课程设计报告集合的交并差运算.docx
《数据结构课程设计报告集合的交并差运算.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告集合的交并差运算.docx(27页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告集合的交并差运算
淮阴工学院
数据结构课程设计报告
作者:
学号:
班级:
学院:
专业:
题目:
指导教师:
2016
年
1
月
1课题描述
编制一个能演示执行集合的交、并和差运算的程序。
集合元素用小写英文字母,执行各种操作应以对话方式执行。
利用单链表表示集合;理解好三种运算的含义
2系统设计
2.1功能模块设计
2.1.1基于单链表设计
(1)节点结构单元模块——定义有序表的节点结构;
typedefstructLNode//定义结构体类型指针
{chardata;
structLNode*next;
}*pointer;
(2)有序表单元模块——实现有序表的抽象数据类型;
readdata(pointerhead)
初始条件:
head是以head为头节点的空链表。
操作结果:
生成以head为头节点的非空链表。
pop(pointerhead)
初始条件:
head是以head为头节点的非空链表。
操作结果:
将以head为头节点的链表中数据逐个输出。
(3)集合单元模块——实现集合获得抽象数据类型;
and(pointerhead1,pointerhead2,pointerhead3)
初始条件:
链表head1、head2、head3已存在
操作结果:
生成一个由head1和head2的并集构成的集合head3。
or(pointerhead1,pointerhead2,pointerhead3)
初始条件:
链表head1、head2、head3已存在
操作结果:
生成一个由head1和head2的交集构成的集合head3。
(4)主程序模块
Voidmain(){
初始化;
do{
接受命令;
处理命令;
}while(“命令”!
=“退出”);}
2.1.2基于顺序表设计
(1)顺序表结构单元模块——定义顺序表的结构体;
typedefstruct//定义SeqList的结构体{
DataTypelist[MaxSize];
intsize;
}SeqList;
(2)函数单元模块——定义各种所需函数;
intListDel(SeqList*L,inti,DataType*x)//顺序表的删除函数
intListGet(SeqListL,inti,DataType*x)//获取顺序表的元素函数
voidListFind(SeqListL,DataTypex)//顺序表查找元素函数
voidSelcetSort(SeqList*L)//顺序表选择排序函数
voidUnionSet(SeqListmylist1,SeqListmylist2)//求并集函数
voidMixedSet(SeqListmylist1,SeqListmylist2)//求交集元素函数
voidDiffentSet(SeqListmylist1,SeqListmylist2)//求差集元素函数
(3)主函数单元模块——定义主函数;
voidmain()
{SeqListmylist1,mylist2;//定义顺序表mylist
inti;
DataTypetemp;
ListInitiate(&mylist1);
ListInitiate(&mylist2);}//初始化两个顺序表
2.2数据结构设计
2.2.1基于单链表设计
定义结构体类型指针,集合采用单链表存储。
typedefstructLNode//定义结构体类型指针
head1=(pointer)malloc(sizeof(structLNode));
head1->next=NULL;
head2=(pointer)malloc(sizeof(structLNode));
head2->next=NULL;
head3=(pointer)malloc(sizeof(structLNode));
2.1.2基于顺序表设计
typedefstruct//定义SeqList的结构体
{DataTypelist[MaxSize];
intsize;
voidUnionSet(SeqListmylist1,SeqListmylist2)//求并集
{
intm,i,j;
DataTypex;
SeqListTest;
ListInitiate(&Test);//定义并初始化
2.3算法设计
2.3.1基于单链表,顺序表设计
图2.1系统模块流程图
否
是
否是
图2.2主菜单流程图
否
是
否
是
图2.3并集模块流程图
求交集与差集的流程图与并集类似。
3详细设计
3.1菜单设计(基于单链表)
图3.1主界面
3.2源代码设计(基于单链表)
#include
#include
typedefstructLNode//定义结构体类型指针
{
chardata;
structLNode*next;
}*pointer;
voidreaddata(pointerhead)//定义输入集合函数
{
pointerp;
chartmp;
scanf("%c",&tmp);
while(tmp!
='\n')
{
p=(pointer)malloc(sizeof(structLNode));//为指针P申请存空间
p->data=tmp;
p->next=head->next;
head->next=p;
scanf("%c",&tmp);
}
}
voidpop(pointerhead)//定义输出集合函数pop()出栈函数
{
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)//遍历链表head1
{
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)//遍历链表head2
{
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);
}
3.3菜单设计(基于顺序表)
图3.2主界面
3.4源代码设计(基于顺序表)
#include
#include
#include
#defineMaxSize100
#defineEQUAL"================================="
typedefcharDataType;
typedefstruct//定义SeqList的结构体
{
DataTypelist[MaxSize];
intsize;
}SeqList;
voidListInitiate(SeqList*L)//初始化操作
{
L->size=0;
}
intListLength(SeqListL)//获取长度
{
returnL.size;
}
intListInsert(SeqList*L,inti,DataTypex)
//插入函数的参数分别是SeqList类型的变量,插入位置I,和插入的元素X
{
intj;
if(L->size>=MaxSize)
{
printf("顺序表已满,无法插入其他元素!
\n");
return0;
system("pause");
}
elseif(i<0&&i>L->size)
{
printf("参数i不合法!
\n");
return0;
system("pause");
}
else
{
for(j=L->size;j>i;j--)
{
L->list[j]=L->list[j-1];//将i至size中间的元素依次后移一个单位
}
L->list[i]=x;//将x插入指定的位置i
L->size++;//L的size,及长度加一
return1;
}}
intListDel(SeqList*L,inti,DataType*x)//顺序表的删除函数
{
intj;
if(L->size<=0)
{
printf("顺序表已无数据可删!
\n");
return0;
system("pause");
}
elseif(i<0&&i>L->size-1)
{
printf("参数i不合法!
\n");
return0;
system("pause");
}
else
{
*x=L->list[i];//保存删除的元素到x中
for(j=i+1;j<=L->size-1;j++)
{
L->list[j-1]=L->list[j];//将i+1至size中间的元素依次前移一个单位
}
L->size--;//L的size,及长度加一
return1;
}}
intListGet(SeqListL,inti,DataType*x)//获取顺序表的元素函数
{
if(i<0||i>L.size-1)
{
printf("参数i不合法!
\n");
return0;
}
else
{
*x=L.list[i];
return1;
}
}
voidListFind(SeqListL,DataTypex)//顺序表查找元素函数
{
inti;
for(i=0;i { if(L.list[i]==x) { printf("与查找元素相同的位置为: %d\n",i+1); continue; } } if(i==L.size-1) { printf("没有找到与所查询相同的元素! \n"); }} voidSelcetSort(SeqList*L)//顺序表选择排序函数 { inti,j; DataTypetemp; intlength=ListLength(*L); for(i=0;i { temp=L->list[i+1]; j=i; while(j>-1&&temp { L->list[j+1]=L->list[j]; j--; } L->list[j+1]=temp; }} voidUnionSet(SeqListmylist1,SeqListmylist2)//求并集 { intm,i,j; DataTypex; SeqListTest; ListInitiate(&Test);//定义并初始化 for(m=0;m { ListGet(mylist1,m,&x); ListInsert(&Test,m,x);//先将顺序表一中的元素放入顺序表中 } for(i=0;i { ListGet(mylist2,i,&x); ListInsert(&Test,m,x);//再将顺序表二中的元素放入顺序表中 m++; } for(i=0;i { for(j=i+1;j if(Test.list[i]==Test.list[j]) ListDel(&Test,j,&x); } SelcetSort(&Test); printf("TheelementsoftheUnionSetare: "); for(i=0;i { ListGet(Test,i,&x); printf("%c",x); } printf("\n"); } voidMixedSet(SeqListmylist1,SeqListmylist2)//求交集元素函数 { intm,i,j; DataTypex; SeqListmylist; ListInitiate(&mylist);//定义并初始化 SeqListTest; ListInitiate(&Test); m=0; for(i=0;i { for(j=0;j if(mylist1.list[i]==mylist2.list[j]) { ListInsert(&Test,m,mylist1.list[i]);//将相同的元素放在Test顺序表中 m++; continue; } } for(i=0;i { for(j=i+1;j if(Test.list[i]==Test.list[j]) ListDel(&Test,j,&x); } SelcetSort(&Test);//对顺序表进行有序化 printf("TheelementsoftheMixedSetare: "); for(i=0;i { ListGet(Test,i,&x); printf("%c",x); } printf("\n"); } voidDiffentSet(SeqListmylist1,SeqListmylist2)//求差集元素函数 { intm=0,n,i,j; DataTypex; SeqListTest; ListInitiate(&Test); for(i=0;i { n=0; for(j=0;j if(mylist1.list[i]==mylist2.list[j]) n++; if(n==0) { ListInsert(&Test,m,mylist1.list[i]);//将相同的元素放在Test顺序表中 m++; } } for(i=0;i { for(j=i+1;j if(Test.list[i]==Test.list[j]) ListDel(&Test,j,&x); } SelcetSort(&Test); printf("TheelementsoftheDiffrentSetare: "); for(i=0;i { ListGet(Test,i,&x); printf("%c",x); } printf("\n"); } voidmain() { SeqListmylist1,mylist2;//定义顺序表mylist inti; DataTypetemp; ListInitiate(&mylist1); ListInitiate(&mylist2);//初始化两个顺序表 printf("\n%s%s\n",EQUAL,EQUAL); printf("\nWelcometotheProgramofCollection! \n"); printf("\n%s%s\n",EQUAL,EQUAL); printf("\n请输入两个集合! \n"); printf("\n请输入集合1! : "); i=0; while((temp=getchar())! ='\n') { if(96 { ListInsert(&mylist1,i,temp);//顺序表一赋值temp; i++; }} printf("\n输入集合2! : "); i=0; while((temp=getchar())! ='\n') { if(96
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 集合 交并 运算