版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
集合的并、交运算(C语言)主题:掌握线性表的存储结构并编制一个能演示执行集合的并、交和差运算的程序。目的:1.掌握线性表的存储结构;2.掌握利用线性表数据结构解决实际问题的方法和基本技巧;要求:1.集合的元素限定为小写字母[‘a’……‘z’],集合大小n<272.集合输入的形式为一个以“回车符”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序应能自动过滤。输出的结果字符串中将不含重复字符或非法字符。3.演示程序以用户和计算机的对话方式执行,即在计算机终端显示“提示信息”之后,由用户在键盘上输入演示过程中规定的运算命令;相应的输入数据和运算结果显示在其后。4.程序执行的命令包括:①构造集合1②构造集合2③求并集④求交集⑤求差集⑥结束首先我们先明确操作要求,构建算法大致流程:采用线性表的顺序存储结构来定义一个有足够大存储空间的集合结构体,并且构造基本基本操作函数,对线性表进行初始化、创建、插入、查找、比较等等,从而实现对集合的取并交差集。以下为代码实现:P.s.开发环境我应用的是VS,故而可直接输出中文,其他环境的算法思想也是一致的,为便于大家理解我加入了一些注释与解说1.进行宏定义,包括一些函数返回值和线性表存储空间的初始分配量和分配增量#include<stdio.h>#include<stdlib.h>#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineOVERFLOW-1#defineLISTSIZE100//初始表空间大小#defineLISTINCREMENT20//表长增量2.定义结构体进行顺序表的动态分配typedefintStatus;typedefcharElemType;typedefstruct{ElemType*elem;intlength;intlistsize;}SqList;SqListLa,Lb,Lc;3.所需函数声明StatusInitList_Sq(SqList&L);StatusListInsert_Sq(SqList&L,inti,ElemTypee);voidCreateList_Sq(SqList&L);StatusEqual(ElemTypea,ElemTypeb);intLocateElem_Sq(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType));voidOutput(SqListL);voidCombine(SqListLa,SqListLb,SqList&Lc);voidIntersection(SqListLa,SqListLb,SqList&Lc);voidDifference(SqListLa,SqListLb,SqList&Lc);4.设计演示执行流程,在主函数中实现子函数分配、调用以及用户交互首先初始化顺序表待存取元素的顺序表;再输出提示信息,提示用户输入两集合的内容,并调用CreateList_Sq函数向顺序表存入数据元素;显示提示信息,用while和switch语句实现功能可循环的选择,并且对其他输入有报错;调用相应子函数,完成交互intmain(){chars;intl=1;InitList_Sq(La);printf("********************集合并、交、差运算系统********************\n");printf("请按照提示信息进行操作:\n");printf("请输入你的第一个集合:\n");CreateList_Sq(La);InitList_Sq(Lb);printf("请输入你的第二个集合:\n");CreateList_Sq(Lb);InitList_Sq(Lc);while(l){printf("\n**********您可以选择a、b、c或者d执行以下操作*********\n\n");printf("a、进行集合的并运算\n");printf("b、进行集合的交运算\n");printf("c、进行集合的差运算\n");printf("d、退出程序\n");scanf("%c",&s);switch(s){case'a':Combine(La,Lb,Lc);printf("集合1与集合2的并集为:");Output(Lc);printf("\n");break;case'b':Intersection(La,Lb,Lc);printf("集合1与集合2的交集为:");Output(Lc);printf("\n");break;case'c':Difference(La,Lb,Lc);printf("集合1与集合2的差集为:");Output(Lc);printf("\n");break;case'd':exit(0);break;default:printf("Error!\n");printf("\n");}printf("****继续执行请输入1,否则请输入0****\n");scanf("%d",&l);getchar();}return0;}5.顺序表初始化,当分配空间成功时,令空表长度为0,存储空间为初始长度StatusInitList_Sq(SqList&L){L.elem=(ElemType*)malloc(LISTSIZE*sizeof(ElemType));if(!L.elem)exit(-1);L.length=0;L.listsize=LISTSIZE;returnOK;}6.当i位置合法时在顺序线性表的第i个位置之前插入新元素,相应表长+1StatusListInsert_Sq(SqList&L,inti,ElemTypee){ElemType*newbase,*p,*q;if(i<1||i>L.length+1)returnERROR;if(L.length>=L.listsize){newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));if(!newbase)exit(-1);L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);//q为插入位置for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;//插入位置及之后的元素往右移*q=e;//插入eL.length++;//表长加1returnOK;}7.将用户输入的字符串通过ListInsert_Sq函数生成存放集合的顺序表voidCreateList_Sq(SqList&L){ElemTypech=0;intn=0,j;while((ch)!='\n'){scanf("%c",&ch);for(j=0;j<L.length;j++)if(ch==L.elem[j]){n=1;break;}elsen=0;if(!n&&ch!='\n')ListInsert_Sq(L,L.length+1,ch);}}8.判断两数据元素是否相等,相等则返回1(TURE),不等返回0(FALSE)StatusEqual(ElemTypea,ElemTypeb){if(a==b)return1;elsereturn0;}9.顺序表查找第一个值与e满足compare()中的的元素的位置,并返回位置,否则返回0intLocateElem_Sq(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType)){ElemType*p;inti;i=1;//i的初值为第1个元素的位序p=L.elem;//p的初值为第1个元素的储存位置while(i<=L.length&&!(*compare)(*p++,e))++i;if(i<=L.length)returni;elsereturn0;}10.利用冒泡排序对将要输出的进行升序排序,并且控制数据元素只能为小写字母voidOutput(SqListL){inti,m,n,z;for(m=0;m<L.length-1;m++){for(n=0;n<L.length-m-1;n++){if(L.elem[n]>L.elem[n+1]){z=L.elem[n];L.elem[n]=L.elem[n+1];L.elem[n+1]=z;}}}for(i=0;i<L.length;i++){if(L.elem[i]>='a'&&L.elem[i]<='z')printf("%c",L.elem[i]);}if(L.length==0)printf("该集合为空集");}11.最后构造并集交集差集函数,用顺序表Lc来存储结果voidCombine(SqListLa,SqListLb,SqList&Lc){inti;ElemTypeelem;Lc.length=0;for(i=0;i<La.length;i++)Lc.elem[Lc.length++]=La.elem[i];for(i=1;i<=Lb.length;i++){elem=Lb.elem[i-1];if(!LocateElem_Sq(La,elem,Equal))ListInsert_Sq(Lc,Lc.length+1,elem);}}voidIntersection(SqListLa,SqListLb,SqList&Lc){inti;ElemTypeelem;Lc.length=0;for(i=1;i<=La.length;i++){elem=La.elem[i-1];if(LocateElem_Sq(Lb,elem,Equal))ListInsert_Sq(Lc,Lc.length+1,elem);}}voidDifference(SqListLa,SqListLb,SqList&Lc){inti;ElemTypeelem;Lc.length=0;for(i=1;i<=La.length;i++){elem=La.elem[i-1];if(!LocateElem_Sq(Lb,elem,Equal))ListInsert_Sq(Lc,Lc.length+1,elem);}}两组测试数据:Set1=”magazine”,Set2=”paper”Set1USet2=”aegimnprz”
set1∩set2=”ae”Set1-Set2=”gimnz”Set1=”012oper4a6tion89”,Set2=”errordata”Set1U
Set2=”adeinoprt”
Set1∩Set2=”aeort”Set1-Set2=”inp”输出如下所示:Set1=”magazine”,Set2=”paper”1.开始运行,运算系统提示用户分别输入集合1,2内容。此处输入实验给出的测试数据,Set1=”magazine”,Set2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 故宫模板课件教学课件
- 街心广场课件教学课件
- 2024年度批量货物搬运与运输合同
- 2024年度某大型工程建设项目施工合同
- 2024年人工智能研究员全职合同
- 2024国际许可合同的格式国际许可合同的种类
- 2024年广告牌更新改造施工合同
- 2024规范的办公室装修合同范本
- 2024店面租房合同范本下载
- 2024年店面租赁升级协议
- 肺胀病(中医临床路径
- 钢结构防尘网施工方案
- “一户一表”改造工程施工组织方案
- 大型及分布式光伏电站视频监控典型配置方案V1.0
- 《十字绣》教学设计及反思
- 桥梁形象进度图
- C站使用说明JRC
- 习作:推荐一个好地方 推荐ppt课件
- 角的度量 华应龙(课堂PPT)
- 公路铣刨机整机的设计含全套CAD图纸
- 机器人学课程教学大纲
评论
0/150
提交评论