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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法与数据结构.docx

1、算法与数据结构 数据结构与算法 课程设计 题 目:集合的计算 表达式转换问题 :八皇后问题 :构造使n个城市连接的最小生成树 目 录摘 要 4一集合的计算 41.采用类语言定义相关的数据类型 42.算法设计 43.函数的调用关系图 54.调试分析 65.测试结果 66.源程序(带注释) 6二表达式转换问题 71.采用类语言定义相关的数据类型 122.算法设计 133.函数的调用关系图 144.调试分析 145.测试结果 146.源程序(带注释) 15三八皇后问题 161.采用类语言定义相关的数据类型 162.算法设计 163函数的调用关系图 184.调试分析 195.测试结果 206.源程序(

2、带注释) 20四构造可以使n个城市连接的最小生成树 161.采用类语言定义相关的数据类型 162.算法设计 163函数的调用关系图 184.调试分析 195.测试结果 206.源程序(带注释) 20总 结 35参考文献 36致 谢 36摘 要1. 通过程序实现两个集合的交并差运算和一个集合的冥集运算2. 输入一个中缀表达式,通过程序输出一个后缀表达式3. 通过程序将八个皇后放置在国际象棋棋盘的无冲突的位置上的算法,并给出所有的解4. 给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价关键词: 线性表;链栈;列队;树一集合的计算设计一

3、个程序,实现两个集合的并集、交集、差集、显示输出等,要求结果集合中的元素不重复;实现一个集合的幂集的求解。1.采用类语言定义相关的数据类型typedef int ElemType;typedef struct /线性表的结构体 ElemType dataMAXSIZE; int length;SqList;2.算法设计A.初始化三个线性表,第一个和第二个线性表分别为两个集合,第三个线性表为计算后的集合void InitList(SqList *L) /初始化线性表 L-data=NULL; L-length=0;B.求并集,把集合1和集合2中的元素不重复的放入集合2中void operate4

4、(SqList *L1,SqList *L2,SqList *L3) /求并集 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-length=res_date; L3-length+; break; C.求交集,把即存在于集合1又存在于集合2的元素放入集合3中D.求差集,把存在于集1合1但不存在于集合2的元素放入集合3中E

5、.求该集合的任意个元素的组合,所有的组合加上空集即是该集合的冥集3.函数的调用关系图4.调试分析a、 输入的数据类型不统一。解决办法:对输入的数据进行筛选和检验b、 算法的时间复杂度为o(n2)c、 算法的空间复杂度为o(n2)5.测试结果例:集合1为1,3,6,9,11集合2为2,4,5,9,12求并集结果:求差集结果:6.源程序(带注释)/*实现两个集合的并集、交集、差集,实现一个集合的幂集的求解。程序中的线性表L1、L2分别为集合L1、L2,线性表L3为计算后的集合*/#include#define MAXSIZE 10 /线性表的最大长度typedef int ElemType;typ

6、edef 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-1=e; L-length+; return 1; else /如果在表

7、尾插入 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); printf(2-查看集合L1,L2n); printf(3-求L

8、1与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 *L2) /处理序号1 int i; ElemType ins_e5; pr

9、intf(请输入集合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); printf(集合L1:); ErgList(L1); printf(集合L2

10、:); 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(L3,L3-length+1,L2-datai); else conti

11、nue; 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-length=res_date; L3-length+; break;

12、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=L2-length-1) L3-dataL3-length=res_d

13、ate; 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); InitList(&L3); start: c=menu(); switch(c)

14、/处理所选的操作 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,&L2,&L3); printf(L1与L2求并集成功!0_0n); pri

15、ntf(按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键返回. . .); scanf(%c,&res); scanf(%c,&res);

16、 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.采用类语言定义相

17、关的数据类型typedef struct StackNode /结点结构体 char data; struct StackNode *next;StackNode,*LinkStackPtr;typedef struct LinkStack /链栈结构体 LinkStackPtr top; int count;LinkStack;2.算法设计先通过栈将所输入的数据进行存储逐个判断运算符的优先级int Priority(DataType op) switch(op) case (: case #: return(0); case -: case +: return(1); case *: cas

18、e /: return(2); 然后再通过栈将数字与运算符输出函数的调用关系图4.调试分析2. 调试中遇到的问题及对问题的解决方法3. 问题:得到的后缀表达式不正确4. 解决办法:使用栈把优先级低的运算符先保存下来5. 时间复杂度:O(n)6. 空间复杂度:O(n)5.测试结果6.源程序(带注释)/求运算符优先级函数int Priority(DataType op) switch(op) case (: case #: return(0); case -: case +: return(1); case *: case /: return(2); /*转换函数将中缀表达式转换成后缀表达式*/v

19、oid ChangeExp(SeqQueue *Q) SeqStack OS;/运算符栈 char c,t; SeqStack *S; S = &OS; InitStack(S);/初始化栈 Push(S,#);/压入栈底元素# do/扫描中缀表达式 c = getchar(); switch(c) case :break;/去除空格符 case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: EnQueue(Q,c);break; case (: Push(S,c);break; case ): case

20、#: do t = Pop(S); if(t != ( & t != #) EnQueue(Q,t); while(t != ( & S-top != -1);break; case +: case -: case *: case /: while(Priority(c) = Priority(GetTop(S) t = Pop(S); EnQueue(Q,t); Push(S,c);break; /EndSwitch while(c!=#);/以#号结束表达式扫描三八皇后问题要求编写程序实现将八个皇后放置在国际象棋棋盘的无冲突的位置上的算法,并给出所有的解。 提示:在国际象棋上放置皇后时,任

21、何一个皇后的水平、竖直和斜45都不能有另一个皇后。解决该问题采用逐次试探的方法,即采用递归调用putchess函数的方法。首先将第一个皇后放于第一行第一列,然后开始向下一行递归。每一步递归中,首先检测待放置位置是否与已放置的皇后冲突,如不冲突,则进行下一行的放置,否则,选择该行的下一个位置进行检测。如整行的位置都冲突,则回到上一行,重新选择位置。1.采用类语言定义相关的数据类型typedef char VerT;#define MaxSize 100#define MaxVertices 10#define MaxWeight 10000#define N 7typedef int DataT

22、ype;typedef struct DataType listMaxSize; int size;SeqList;2.算法设计A、 数据初始化。B、 从n列开始摆放第n个皇后(因为这样便可以符合每一竖列一个皇后的要求),先测试当前位置(n,m)是否等于0(未被占领)。如果是,摆放第n个皇后,并宣布占领(记得姚横列竖列斜列一起设置),接着进行递归;如果不是,测试下一个位置(n,m+1),但是如果当n8时,便打印出结果。E、输出函数我使用printf输出,运行形式为:第m种方法为:* * * * * * * * 3函数的调用关系图4.调试分析在完整程序调试时遇到几个小问题,后经细心改正后才把调试

23、工作做完。例如:当用printf输出时,出现了一些错误,几经调试后,发现原来是缺少了stdio.h这样一个头文件,添加了头文件后, 还出现了一些问题,逻辑错误导致程序死循环或不循环或循环一小部分,但是编译时却没有错误,就是没有正确的输出答案,一开始我也不知道是怎么回事,通过和同学的交流,发现是逻辑错误,经过改正后,程序终于可以运行了.时间复杂度O(n2)空间复杂度(1),5.测试结果6.源程序(带注释)#include #include #include #include #include #define QUEENS 8int iCount = 0; /!记录解的序号的全局变量。int Si

24、teQUEENS; /!记录皇后在各行上的放置位置的全局数组。void Queen(int n); /!递归求解的函数。void Output();/!输出一个解。int IsValid(int n); /!判断第n个皇后放上去之后,是否有冲突。void main() /*-Main:主函数。-*/ system(title 叶青-递归算法八皇后问题 );cout 八皇后的解法:endl;cout -endl; Queen(0); /!从第0行开始递归试探。 getch();/!按任意键返回。 void Queen(int n) /*-Queen:递归放置第n个皇后,程序的核心!-*/ int i; if(n = QUEENS) /!参数n从0开始,等于8时便试出了一个解,将它输出并回溯。 Output(); return; for(i = 1 ; i = QUEENS ; i+) /!n还没到8,在第n行的各个行上依次试探。 Siten = i; /!在该行的第i行上放置皇后。 if(IsValid(n) /!如果放置没有冲突,就开始下一行的试探。

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

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