算法与数据结构解析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2014年秋季学期

数据结构与算法课程设计

题目:集合运算问题、计算1的个数问题、

方程求解问题、图的基本操作与实现

目录

摘要 (3)

一.集合运算问题 (4)

1.采用类语言定义相关的数据类型 (4)

2.算法设计 (4)

3.函数的调用关系图 (6)

4.调试分析 (7)

5.测试结果 (7)

6.源程序(带注释) (8)

二.计算1的个数问题 (13)

1.数据结构 (13)

2.算法设计 (14)

3.调试分析 (14)

4.测试结果 (14)

5.源程序(带注释) (14)

三.方程求解问题 (15)

1.采用类语言定义相关的数据类型 (15)

2.算法设计 (15)

3.函数的调用关系图 (15)

4.调试分析 (15)

5.测试结果 (16)

6.源程序(带注释) (16)

四.图的基本操作与实现......................................................................................17

1.数据结构...............................................................................................18

2.算法设计...............................................................................................18

3.运行结果................................................................................................20

4.源程序(带注释)....................................................................................20 总结 (25)

参考文献 (26)

致谢 (26)

摘要

第一个程序是编写算法实现集合的相关操作包括集合的输入、输出、删除集合中重复的元素、删除、修改,求两个集合的交、并、差。采用单链表对集合进行操作、运行等。需要用到二叉树思想、便利线性表和双重循环结构等完成问题。

第二个程序是递归结构计算1的个数问题,共分为两种情况,奇数情况和偶数情况。

第三个程序为方程求解问题,用c语言实现方程A5+B5+C5+D5+E5=F5刚好有一个满足0≤A≤B≤C≤D≤E≤F≤75的整数解的问题。也可以将生活中的实际问题转换成此类方程的求解,这样进行程序的迭代和功能的更新,就可以实现更多未知数、更高次、更多解的方程求解问题,和涉及此类方程求解的实际问题。

第四个程序为图的一些基本操作,内容包括图的存储结构、图的深度优先遍历,广度优先遍历,图节点的度数等等。

关键词:集合,单链表,递归,替换,连通图,方程求解,数据结构,图的遍历

一.集合运算问题

设计一个程序,实现两个集合的并集、交集、差集、显示输出等,要求结果集合中的元素不重复;实现一个集合的幂集的求解。

1.采用类语言定义相关的数据类型

定义一个结构体存储结构,用来生成求幂集的二叉树只在求幂集函数内使用

t y p e d e f s t r u c t//根节点结构体(幂集使用)

{

int data[MAX];

int length;

}root;

定义一个二维数组,用来存储节点选择情况,其第一个下标表示是左孩子还是右孩子,第二个表示节点当前所处的层数

int c[2][MAX]; //c构造数据池

2.算法设计

1.并集:用两个循环结构为并集赋值,最后进行重复元素检查(check())。for(i=0;i

{

c[i]=a[i];

}

for(i=0;i<=m;i++) //B集合赋值

{

c[n+i]=b[i];

}

k=n+m; //集合大小

k=check(c,k); //集合重复元素检查

2.利用双重循环判断元素是否在A、B里面均存在,存在则赋值在C里面

for(i=0;i<=n;i++) //在A里面检查

for(j=0;j<=m;j++) //在B里面检查

{

if(a[i]==b[j]) //元素在A和B里面均出现

{

c[k]=a[i]; //赋值

k++; //C集合容量加1

printf(" %d",c[k-1]); //屏幕输出

}

}

3.利用双重循环判断只在A里面出现过的元素,并把它们赋值到C里面

for(i=0;i<=n;i++) //在A里面检查

{

for(j=0;j<=m;j++) //在B里面检查

{

if(a[i]==b[j]) //两个集合都有直接退出循环

{

flag=0; //更改标志

break;

}

else

flag=1;

}

if(flag) //通过标识检查

{

c[k]=a[i];

printf(" %d",c[k]);

}

}

4.利用二叉树的思想求解幂集,我们认为根节点为空集,然后每一层向树里面加一个元素,直到集合中所有元素添加完毕,在具体每一层中,上一层的叶子节点会有两个孩子,左孩子表示有这一层的元素,右孩子没有,这样的话通过最后一层的叶子节点的扫描就可以得到所有幂集

shu(int n,root *b,int d,int k) /*递归建树*/

{

int i;

相关文档
最新文档