ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:24.26KB ,
资源ID:11445461      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11445461.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(集合运算.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

集合运算.docx

1、集合运算计算机学院教学实验报告课程名称高级程序语言实验成 绩教师签名实验名称集合基本运算实验序号实验日期姓 名学 号专 业年级-班1、实验目的及实验内容(本次实验所涉及并要求掌握的知识;实验内容;必要的原理分析)小题分:1. 问题描述【问题描述】编写一个能演示执行两个集合之间的并、交和差运算结果的程序。【基本要求】1) 两个集合中的元素为长度不同的字符串,字符串中可包含大小写字符和数字字符,2) 程序以用户的输入数据建立集合,然后执行集合运算,分别输出结果2. 问题涉及到的知识单链表的建立排序算法有序链表的合并字符的输入3. 解决思路原理1) 输入字符,头插法建立链表2) 利用冒泡排序对链表进

2、行排序,建立有序链表3) 将有序链表A和B进行合并成链表C后,删去相同的字符,实现集合的并运算4) 对有序链表A中每个元素进行检查,求有序链表A和B中相同的字符,实现集合的交运算5) 对有序链表A中每个元素进行检查,删去与B中字符相同的部分,实现集合的减运算 2、实验环境及实验步骤(本次实验所使用的器件、仪器设备等的情况;具体的实验步骤)小题分:1.运行平台Dev C+5.112.实验步骤1) 查阅资料,对集合的交、并、减运算算法的一般实现方法进行大致的印象记忆2) 分析问题,分析需要的函数功能,进行模块划分3) 分析合适的数据结构,确定合适的函数返回类型4) 翻阅数据结构和高级程序设计语言检

3、验设想的正确与否,并参考书上的实例,确定主要算法5) 进行编程6) 调试,查阅资料,修改7) 撰写实验报告,反思实验的不足3、实验过程分析(详细记录实验过程中发生的故障和问题,进行故障分析,说明故障排除的过程及方法。根据具体实验,记录、整理相应的数据表格、绘制曲线、波形等)小题分:1. 实验过程问题:1) 对函数的传递功能不明确,导致无法成功地将数据传递下去2) 没有考虑运行效率,导致算法性能不强,连用if语句,造成程序无法顺利运算3) 没有及时释放链表内存,造成内存泄漏4) 对集合的减运算没有清晰的认识,造成减运算输出错误5) 对链表的结构不清晰,在输出链表时,漏掉头或尾数据6) 不能自动滤

4、去非法字符(如空格、阿拉伯数字等)。7) 刚开始时曾忽略了一些变量参数的标识”&”,使调试程序浪费时间不少。今后应重视确定参数的变量和赋值属性的区分和标识8) 格式不统一,阅读起来不流畅解决措施:1) 翻查资料,询问同学,加深对链表的理解2) 将IF语句的判断条件转化成其他语句,实现对其判断3) 运行结果不正确时,对算法进行重复思考,寻找出正确的解决途径2. 代码主体部分void readdata(LinkList *&L);/定义输入集合函数,头插法建链表 void SortList(LinkList *&La); /对链表排序 void DeleteSame(LinkList *&La);

5、/删去链表中相同的节点 void add(LinkList *La,LinkList *Lb,LinkList *Lc);/合并有序链表La和Lb void intersection(LinkList *La,LinkList *Lb,LinkList *Lc);/对有序链表La和Lb求交集 void sub(LinkList *La,LinkList *Lb);/求有序链表La减有序链表Lbint main();3. 数据结构分析有序单链表结构体typedef struct LinkNode char data; struct LinkNode *next;LinkList;4. 运行结果4

6、、实验结果总结(对实验结果进行分析,完成思考题目,总结实验的新的体会,并提出实验的改进意见)小题分:1. 复杂度分析时间复杂度O(n*n)空间复杂度O(1)2. 运行效率指针需要进行动态内存分配以及及时的释放链表,在没有及时的释放内存的情况下,时而造成程序的异常,但是整体而言,程序运行速度较快3. 改进意见1) 排序算法空间复杂度小,但是并没有对冒泡排序进行优化,不适合大数据,可采用希尔排序等其他排序方式;2) 及时释放链表内存3) 从计算机组成原理的角度去看代码的写成,分支语句不能进行多次的重复,会造成汇编时的不便#include#includetypedef struct LinkNode

7、 char data; struct LinkNode *next;LinkList;void readdata(LinkList *&L);/定义输入集合函数,头插法建链表 void SortList(LinkList *&La); /对链表排序 void DeleteSame(LinkList *&La);/删去链表中相同的节点 void add(LinkList *La,LinkList *Lb,LinkList *Lc);/合并有序链表La和Lb void intersection(LinkList *La,LinkList *Lb,LinkList *Lc);/对有序链表La和Lb求

8、交集 void sub(LinkList *La,LinkList *Lb);/求有序链表La减有序链表Lbint main() int x=0; LinkList *La,*Lb,*Lc; La=(LinkList *)malloc(sizeof(LinkList); La-next=NULL; Lb=(LinkList *)malloc(sizeof(LinkList); Lb-next=NULL; Lc=(LinkList *)malloc(sizeof(LinkList); Lc-next=NULL; printf(请输入一个字符串集合A(可包含数字)以!结尾n); readdata(

9、La); printf(n); printf(集合A排序结果是); SortList(La); printf(nn); printf(请再输入一个字符串集合B(可包含数字)以!结尾n); readdata(Lb); printf(n); printf(集合B排序结果是); SortList(Lb);A:printf(1.并集 2.交集 3.差集 4.结束 x.重新运算n); do printf(请选择序号n); scanf(%d,&x);switch(x)case 1: add(La,Lb,Lc); /调用并集函数 Lc-next=NULL; break;case 2: intersectio

10、n(La,Lb,Lc);/调用交集函数 Lc-next=NULL; break;case 3: sub(La,Lb);/调用差集函数 Lc-next=NULL; break; case 4:break; default:goto A; while(x!=4); system(PAUSE); return 0; void readdata(LinkList *&L)/定义输入集合函数,头插法建链表 LinkList *p; char tmp; scanf(%c,&tmp); while(tmp!=!) p=(LinkList *)malloc(sizeof(LinkList); p-data=t

11、mp; p-next=L-next; L-next=p; scanf(%c,&tmp); p=L-next; while(p!=NULL) printf(%c,p-data); p=p-next; printf(n);void create(char str,LinkList *&L) /采用尾插法建立有序链表 LinkList *s,*r; int i; r=L; for (i=0;stri!=0;i+) s=(LinkList *)malloc(sizeof(LinkList); s-data=stri; r-next=s; r=s; r-next=NULL; void SortList(

12、LinkList *&La)/对链表排序 LinkList *p; LinkList *pre,*q; p=La-next-next; La-next-next=NULL; while(p!=NULL)/冒泡排序 q=p-next; pre=La; while(pre-next!=NULL&pre-next-datadata) pre=pre-next; p-next=pre-next; pre-next=p; p=q; p=La-next; while(p!=NULL) printf(%c,p-data); p=p-next; printf(n);void DeleteSame(LinkLi

13、st *&La)/删去链表中相同的节点 LinkList *p,*q; p=La-next; char c1,c2; while(p-next!=NULL) c1=p-data; c2=p-next-data; if(c1=c2)/如果有相同的节点,则删去其中一个 q=p-next; p-next=q-next; free(q); p=p-next; void add(LinkList *La,LinkList *Lb,LinkList *Lc)/合并有序链表La和Lb LinkList *r,*s,*pc; LinkList *pa=La-next; LinkList *pb=Lb-next

14、;/pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点 r=Lc; /r始终指向Lc的尾节点 while(pa!=NULL & pb!=NULL) if(pa-datadata) /取较小者La中的元素,将pa链接在pc的后面,pa指针后移 s=(LinkList *)malloc(sizeof(LinkList); s-data=pa-data; r-next=s;r=s; pa=pa-next; else if (pa-datapb-data) /取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移 s=(LinkList *)malloc(sizeof(Link

15、List); s-data=pb-data; r-next=s;r=s; pb=pb-next; else s=(LinkList *)malloc(sizeof(LinkList); s-data=pb-data; r-next=s;r=s; pb=pb-next; pa=pa-next; while(pa!=NULL) /*if(pa-dataz|pa-datadatadataZ) pa=pa-next;*/ s=(LinkList *)malloc(sizeof(LinkList); s-data=pa-data; r-next=s;r=s; pa=pa-next; while(pb!=

16、NULL) /* if(pb-dataz|pb-datadatadataZ) pb=pb-next;*/ s=(LinkList *)malloc(sizeof(LinkList); s-data=pb-data; r-next=s;r=s; pb=pb-next; r-next=NULL; DeleteSame(Lc); pc=Lc-next; printf(并集为n); while(pc!=NULL) printf(%c,pc-data); pc=pc-next; printf(n);void intersection(LinkList *La,LinkList *Lb,LinkList

17、*Lc)/对有序链表La和Lb求交集 LinkList *pa=La-next; LinkList *pb=Lb-next; LinkList *r,*s,*pc;/pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点 r=Lc; /r始终指向Lc的尾节点 while(pa!=NULL&pb!=NULL) if(pa-data=pb-data) s=( LinkList *)malloc(sizeof(LinkList); s-data=pa-data; r-next=s;r=s; pa=pa-next; else if(pa-datapb-data) pb=pb-next;

18、 else pa=pa-next; r-next=NULL; DeleteSame(Lc); pc=Lc-next; printf(交集为n); while(pc!=NULL) printf(%c,pc-data); pc=pc-next; printf(n); void sub(LinkList *La,LinkList *Lb)/求有序链表La减有序链表Lb LinkList *pa,*pb,*apre; char e; int flag; pa=La; apre=La; while(pa!=NULL)/遍历链表La中的每一个元素 flag=0; e=pa-data; pb=Lb;/对La

19、中的每一个元素e,都从Lb的表头开始查找 while(pb!=NULL) if (pb-data=e) /若La中的元素Lb也有,则在La中删除该元素 if (pa=La) /pa是表头 La=pa-next; apre=pa-next; pa=pa-next; flag=1; else if(pa-next=NULL)/pa是表尾 pa=NULL; apre-next=pa; flag=1; else/非表头元素和表尾元素 apre-next=pa-next; pa=pa-next; flag=1; break; else pb=pb-next; if (flag=0) apre=pa; pa=pa-next; printf(两集合之差为(前面的字符集合减去后面的字符集合)n); pa=La; while(pa!=NULL) printf(%c,pa-data); pa=pa-next; printf(n);

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

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