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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法与数据结构.docx

1、算法与数据结构 数据结构与算法 课程设计题 目:集合运算问题;计算1的个数问题;递归替换问题;图的基本操作与实现目 录摘 要 4一集合运算问题 51.采用类语言定义相关的数据类型 52.算法设计 53.函数的调用关系图(如图1) 64.调试分析 75.测试结果 76.源程序(带注释) 9二计算1的个数问题 171.采用类语言定义相关的数据类型 172.算法设计 173.函数的调用关系图 174.调试分析 175.测试结果 186.源程序(带注释) 18三 递归替换问题 191.数据结构设计 192.算法设计 203.函数的调用关系图 214.调试分析 225.测试结果 226.源程序(带注释)

2、 22四、图的基本操作与实现 251.设计概要 252.算法设计 263.函数的关系调用图 264.调试分析 265.测试结果 266.源程序(带注释) 28总 结 39参考文献 40致 谢 41摘 要集合运算问题:使用链表来表示集合,完成集合的合并,求交集等操作。初步完成总体设计,搭好框架,确定函数个数;完成最低要求; 继续完成进一步要求;界面友好,函数功能要划分好;总体设计应画流程图;程序要加必要的注释;要提供程序测试方案。 计算1的个数问题:N为正整数,计算从1到N的所有整数中包含数字1的个数。比如,N=10,从1,2.10,包含有2个数字1。相信很多人都能立刻得出以下的解法这是最直接的

3、解法,但遗憾的是,时间复杂程度为O(N*logN)。因为还需要循环判断当前的n的各位数,该判断的时间复杂程度为O(logN)。接下来就应该思考效率更高的解法了。说实话,这道题让我想起另外一道简单的算法题:N为正整数,计算从1到N的整数和。递归替换问题:程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的

4、语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。图的基本操作与实现:图的广度优先遍历:采取邻接矩阵结构,指定任意顶点x为初始顶点,利用顺序循环队列以保持访问过的结点的顺序1.首先访问初始结点v并标记结点v为已访问;2.结点v入队列;3.当队列非空时则继续执行,否则算法结束;4.出队列取得队头结点u;5.查找u的第一个邻接结点w6.若u的邻接结点w不存在则转到步骤3,否则循环执行下列步骤:6.1若结点w尚未被访问,则访问结点w并标记结点w为已访问;6.2结点w入队列;6.3查找结点u的w邻接结点的下一个邻接

5、结点w,转到步骤6 关键词:集合运算;递归程序,十进制数;递归,无限集合;广度优先,深度优先。一集合运算问题设计一个程序,实现两个集合的并集、交集、差集、显示输出等,要求结果集合中的元素不重复;实现一个集合的幂集的求解。1.采用类语言定义相关的数据类型定义一个结构体存储结构,用来生成求幂集的二叉树只在求幂集函数内使用 typedef struct /根节点结构体(幂集使用) int dataMAX; int length; root; 定义一个二维数组,用来存储节点选择情况,其第一个下标表示是左孩子还是右孩子,第二个表示节点当前所处的层数int c2MAX; /c构造数据池2.算法设计 程序执

6、行的命令包括:定义单链表结点类型typedef struct LNode (2)运用尾插法建立单链表void CreatListR(LinkList *&L,ElemType a,int n) (3)创建头结点,为头结点分配空间 (4)创建新结点(5)建立有序链表void Sort(LinkList *&head) (6)将两个集合的元素进行比较 while语句 (7)删除有序链表中的重复元素void shanchu(LinkList *&head) (8)求交集void jiao(struct Lnode *L1,struct Lnode *L2,struct Lnode *L3) (9)求

7、并集void bing(struct Lnode * L1,struct Lnode *L2, struct Lnode *L3)(10)输出单链表void Display(LinkList *L)3.函数的调用关系图(如图1) 图1-14.调试分析a、输入集合数据的时候必须要一个一个输,不能依次输入很多,否则会引起错误b、算法的时间复杂度O(n2)。5.测试结果 图1-2 图1-3 图1-46.源程序(带注释)/*实现两个集合的并集、交集、差集,实现一个集合的幂集的求解。程序中的线性表L1、L2分别为集合L1、L2,线性表L3为计算后的集合*/#include#define MAXSIZE

8、10 /线性表的最大长度typedef int ElemType;typedef struct /线性表的结构体 ElemType dataMAXSIZE; int length;SqList; /线性表的操作函数/void InitList(SqList *L) /初始化线性表 L-data=NULL; L-length=0;int ListInsert(SqList *L,int i,ElemType e) /向表中插入元素 int k; if(ilength) /如果不在表尾插入 for(k=L-length-1;k=i-1;k-) L-datak+1=L-datak; L-datai-

9、1=e; L-length+; return 1; else /如果在表尾插入 L-datai-1=e; L-length+; return 1; void ErgList(SqList *L) /遍历线性表并依次返回元素 int j; ElemType res_date; for(j=0;jlength;j+) res_date=L-dataj; printf(%4d,res_date); printf(n);/该程序的操作函数/int menu() /菜单函数 int m_cho; system(cls); printf(-MENU-n); printf(1-给集合L1和集合L2添加元素n

10、); printf(2-查看集合L1,L2n); printf(3-求L1与L2的并集n); printf(4-求L1与L2的交集n); printf(5-求L1与L2的差集n); printf(6-求L1的冥集n); printf(7-求L2的冥集n); printf(8-退出系统n); printf(-n); printf(-请输入序号: bb); scanf(%d,&m_cho); if(1=m_cho&m_cho=6) return m_cho; else system(cls); exit(); return 0; void operate1(SqList *L1,SqList *L

11、2) /处理序号1 int i; ElemType ins_e5; printf(请输入集合L1中的元素(仅限整数):n); for(i=0;i5;i+) /接受集合L1的元素 scanf(%d,&ins_ei); ListInsert(L1,i+1,ins_ei); printf(请输入集合L2中的元素(仅限整数):n); for(i=0;i5;i+) /接受集合L2的元素 scanf(%d,&ins_ei); ListInsert(L2,i+1,ins_ei); void operate2(SqList *L1,SqList *L2) /处理序号2 printf(-查看元素-n); pri

12、ntf(集合L1:); ErgList(L1); printf(集合L2:); ErgList(L2); printf(-n);void operate3(SqList *L1,SqList *L2,SqList *L3) /处理序号3 int i,j; InitList(L3); /初始化L3 *L3=*L1; for(i=0;ilength;i+) /将L2中的元素放入L3中且无重复元素 for(j=0;jlength;j+) if(L3-dataj=L2-datai) /选择存在于L2但不存在于L3的元素 break; else if(j=L3-length-1) ListInsert(

13、L3,L3-length+1,L2-datai); else continue; printf(-求并集结果-n); ErgList(L3); printf(-n);void operate4(SqList *L1,SqList *L2,SqList *L3) /处理序号4 int i,j; ElemType res_date; InitList(L3); /初始化L3 for(i=0;ilength;i+) /将属于L1同时也属于L2的元素赋值给L3 res_date=L1-datai; for(j=0;jlength;j+) if(res_date=L2-dataj) L3-dataL3-

14、length=res_date; L3-length+; break; printf(-求交集结果-n); ErgList(L3); printf(-n);void operate5(SqList *L1,SqList *L2,SqList *L3) /处理序号5 int i,j; ElemType res_date; InitList(L3); /初始化L3 for(i=0;ilength;i+) /将属于L1但不属于L2的元素赋值给L3 res_date=L1-datai; for(j=0;jlength;j+) if(res_date=L2-dataj) break; else if(j

15、=L2-length-1) L3-dataL3-length=res_date; L3-length+; else continue; printf(-求差集结果-n); ErgList(L3); printf(-n);void operate6(SqList *L1,SqList *L3) /处理序号6void operate7(SqList *L2,SqList *L3) /处理序号7int main() int c; char res; SqList L1,L2,L3; /定义线性表L1,L2,L3 InitList(&L1); /初始化线性表 InitList(&L2); InitLi

16、st(&L3); start: c=menu(); switch(c) /处理所选的操作 case 1: operate1(&L1,&L2); printf(元素输入成功!0_0n); printf(按ENTER键返回. . .); scanf(%c,&res); scanf(%c,&res); goto start; case 2: operate2(&L1,&L2); printf(元素查看成功!0_0n); printf(按ENTER键返回. . .); scanf(%c,&res); scanf(%c,&res); goto start; case 3: operate3(&L1,&L

17、2,&L3); printf(L1与L2求并集成功!0_0n); printf(按ENTER键返回. . .); scanf(%c,&res); scanf(%c,&res); goto start; case 4: operate4(&L1,&L2,&L3); printf(L1与L2求交集成功!0_0n); printf(按ENTER键返回. . .); scanf(%c,&res); scanf(%c,&res); goto start; case 5: operate5(&L1,&L2,&L3); printf(L1与L2求差集成功!0_0n); printf(按ENTER键返回. .

18、 .); scanf(%c,&res); scanf(%c,&res); goto start; case 6: operate6(&L1,&L3); printf(求L1的冥集成功!0_0n); printf(按ENTER键返回. . .); scanf(%c,&res); scanf(%c,&res); goto start; case 7: operate7(&L2,&L3); printf(求L2的冥集成功!0_0n); printf(按ENTER键返回. . .); scanf(%c,&res); scanf(%c,&res); goto start; return 0;二计算1的个

19、数问题1.采用类语言定义相关的数据类型2.算法设计if(N=1)n=1;elseif(N+1)%2=0)n=count(N/2)+1;/奇数情况若N是奇数,那么它的二进制中1的个数等于N/2的二进制中1的个数加1,elseif(N%2=0)n=count(N+1)-1;/偶数情况若N是奇数,N-1是偶数,比N少一个最低位的1,1的个数就是N/2的二进制中1的个数-1returnn;3.函数的调用关系图4.调试分析调试过程中开始由于某个地方的分号没打上。出现了错误的提示。然后经过一番调试,找到了症结所在,测试数据时使用了多组数据,并用笔算了一下,看输出序列是否与实际有偏差,因为程序有时候会运行正

20、确,但这并不确定输出正确,实践是检验真理的唯一标准。5.测试结果6.源程序(带注释)#includeint count(int N) int n; if(N=1) n=1; else if(N+1)%2=0) n=count(N/2)+1;/奇数情况,若N是奇数,那么它的二进制中1的个数等于N/2的二进制中1的个数加1; else if(N%2=0) n=count(N+1)-1;/偶数情况,若N是奇数,,N-1是偶数,比N少一个最低位的1,1的个数就是N/2的二进制中1的个数-1 return n;void main() int N; printf(请输入数字:); scanf(%d,&N)

21、; printf(二进制中1的个数:%dn,count(N); 三 递归替换问题1. 、数据结构设计typedef struct /创建结构体,让文件的读写方便 char dataMAX; /数据项char1;intprint(char chMAX,int n) /递归函数2. 算法设计 FILE *fp,*fp1; char sMAX; /s,存储#后面的include char1 bMAX; /b,文件中内容在内存中的存储位置 int i=0,k,d=0,j,flag; /switch参数,用于确认调用函数的参数 if(fp=fopen(ch,rb+)=NULL) printf(文件打开失

22、败!n); exit(0); while(!feof(fp) fread(&bi,1,sizeof(char1),fp); i+; if(bi-1.data0=) /结构体数组计数器 break; k=i-1; /记录b大小,可以认为是对应文件的行数 fclose(fp);3函数的调用关系图 4.调试分析5.测试结果6.源程序(带注释)# include # include # include #define MAX 100typedef struct /创建结构体,让文件的读写方便 char dataMAX; /数据项char1;intprint(char chMAX,int n) /递归函

23、数 FILE *fp,*fp1; char sMAX; /s,存储#后面的include char1 bMAX; /b,文件中内容在内存中的存储位置 int i=0,k,d=0,j,flag; /switch参数,用于确认调用函数的参数 if(fp=fopen(ch,rb+)=NULL) printf(文件打开失败!n); exit(0); while(!feof(fp) fread(&bi,1,sizeof(char1),fp); i+; if(bi-1.data0=) /结构体数组计数器 break; k=i-1; /记录b大小,可以认为是对应文件的行数 fclose(fp); if(fp

24、1=fopen(辅助.c,ab+)=NULL) printf(文件打开失败!n); exit(0); d=0; /s数组存取计数器 for(i=0;ik;i+) if(bi.data0=#) /发现include,递归调用print for(j=2;j9;j+) sd=bi.dataj; d+; if(strcmp(s,include)=0) flag=bi.data19-0; switch(flag) /带选择的递归调用 case 1:fp=print(filename1.c,1);break; case 2:fp=print(filename2.c,2);break; case 3:fp=

25、print(filename3.c,3);break; default:break; else /否则的话讲代码存入辅助文件 printf(%sn,bi.data); fwrite(&bi,1,sizeof(char1),fp); fputc(r, fp); fputc(n, fp); else /否则的话讲代码存入辅助文件 printf(%sn,bi.data); fwrite(&bi,1,sizeof(char1),fp1); fputc(r, fp); fputc(n, fp); close(fp1); return 0;四、图的基本操作与实现1.设计概要(1)自选存储结构,输入含n个顶点(用字符表示顶点)和e条边的图G;(2)求每个顶点的度,输出结果;(3)指定任意顶点x为初始顶点,对图G作DFS遍历,输出DFS顶点序列(提示:使用一个栈实现DFS);(4)指定任意顶点x为初始顶点,对图G作BFS遍历,输出BFS顶点序列(提示:使用一个队列实现BFS);(5)输入顶点x,查找图G:若存在含x的顶点,则删除该结点及与之相关连的边,并作DFS遍历(执行操作

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

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