题目集合运算
专业计算机科学与技术
班级。学生。
题目。集合运算。
题目内容。问题一:子集求和问题。
有一集合中有 n 个元素,每个元素均为自然数。给定任意一个 m,求满足子集中各元素之和等于m的所有子集。
问题二:求最小元素。
问题描述:1 1 是集合的元素;
若 p 是集合的元素,则 2*p+1,4*p+5 也是集合的元素。
求:此集合中最小的 k 个元素。
1 本人完成的工作
1. 编写集合输出函数out。
2. 编写一个集合创建函数great_set,自行输入元素,没有重复元素,并输出集合元素。
3. 编写函数output输出满足集合中各元素之和为m的集合的所有子集。
4. 编写函数all_subset,输出集合中所有小于m的元素所组成的所有子集。
5. 编写函数select_element,筛选集合中小于或等于m的元素,并输出。
6. 编写gather函数,输出集合中满足条件的k个元素。
7. 编写函数disy(),调用gather实现第二问的功能。
8. 编写主函数main,并通过函数调用,实现所有功能。
2 所采用的数据结构单链表。
typedef struct stud
int a集合元素。
struct stud *next; /指向下一个结点的指针。
stud;
3 所设计的函数。
1.集合输出函数。
算法思想:从单链表的头指针之后的第一个结点开始取数据并输出,若第一个结点为空,输出集合为空集。
2、集合创建函数。
算法思想:开始输入n作为生成的集合的元素个数,当n>1时,输入数据过大,重新输入。当n≤100时,开始输入集合元素,第一个数据元素存入链表,当新输入的数据和刚刚输入的数据相等时显示已经输入,重新输入;不相等时,存入链表,当输入元素个数为n时,结束输入,调用out(),输出你刚刚输入的集合。
3.输出满足集合中各元素之和为m的集合的函数。
算法思想:当used[j]=1时相加,求出子集所以元素之和count,然后再与输入的和m比较,如果count=m,就把子集的元素输出,如果count!=m,此次循环结束。
4.函数all_subset,输出集合中所有小于m的元素所组成的所有子集。
算法思想:n个数,每个数取或不取,f(判断第j个数)
若n个数都判断完(j>=n),输出刚才所取的数,返回。
否则:不取第j个数,f(判断第j+1个数)
取第i个数,f(判断第j+1个数)
5.编写函数select_element,筛选集合中小于或等于m的元素,并输出。
算法思想:先判断p是不是尾结点,若不是的再比较p->与m的大小,把比m小的元素存到数组a[i]中,当p=null是,输出比m小的元素组成的集合q,再调用all_subset函数,求q的子集。
6.编写gather函数,输出集合中满足条件的k个元素。
算法思想:因为这是个无穷集,不可能将所有结果都表示出来,但通过观察我们知道,想要得到最小的k个元素,只要知道最多2的k次方减去1个元素就行了。在这个部分集里,我们就可以找到符合条件的元素。
初始时i=0,j=0,当j小于k时,j++。由1开始生成集合,集合的个数为2的k次方。当j=k时,说明已经将k层的每个元素都放到了数组中,在这个for循环里,就是将已经建立的数组进行排序,便于输出。
7.编写函数disy(),调用gather实现第二小题的功能。
算法思想:首先输入一个k值,就是要输出的元素个数,调用malloc,根据k值开辟空间,调用gather(),输出集合k个最小元素。
8.编写主函数main,并通过函数调用,实现所有功能。
算法思想:调用函数creat,创建集合,并输出。输入给定的和m,调用select_element(),计算并输出所有满足条件的自己的元素。
运行结果:第一小题。
第二小题。 问题与总结。
问题:1、在做第一问时,求n个元素的集合中小于给定的m的元素所组成的集合的全部子集,时算法一时间没有想出来。问了同学才能写出算法。
2、第二问时,由于由1生成元素所组成的集合元素个数是无限,要取其中一部分就可以了,前面k个最小的元素,最多用到第k层,就可以了。
总结:通过这次数据结构课程设计,使我对函数的调用比较深刻的了解,对集合数组和链表的使用有了清晰的认识,使我感觉到到,一个优秀的软件,不仅仅是可以运行的,协调的布局,合理的结构,良好的性能和一定的容错性。一个人要完成所有的工作是非常困难和耗时的。
源程序:#include<>
#include<>
#include<>
#define max_size 100
int * list,i=0,j=0,k=0,s=0;
typedef struct stud
int a集合元素。
struct stud *next; /指向下一个结点的指针。
stud;
问题一集合结点的定义。
int a[max_size用来存放小于m的元素。
int used[max_size]; 存放标志位的数组。
void out(stud *g集合的输出。
stud *p;
p=g->next;
while(p!=null)
printf("");
void great_set(stud *g) /集合的创建。
stud *p,*q,*pr;
int n,i,k;
p=g;int a=1;
while(a=1)
for(i=1;i<=n;i++)
if(pr==null如果输入的自然数与集合中原有数据不相同。
out(g);
void output(int a[max_size],int i,int m) /满足集合中各元素之和为m的所有子集。
int j,count=0;
for(j=0;j
if(count==m) /满足和为m的子集输出。
printf("");
void all_subset(int a[max_size],int j,int i,int m)//所有小于m的元素组成的子集。
if(j>=i)
output(a,i,m);
elsevoid select_element(stud *g,int m) /筛选出不大于m的元素。
stud *p;
int i=0,k,j=0;
p=g->next;
while(p!=null)
p=p->next;
printf("小于等于%d的数的集合",m);
for(k=0;k printf("%d,",a[k]);
printf("");
printf("满足集合各元素之和为%d的子集如下:",m);
all_subset(a,j,i,m);
void gather(){
i+=(int)pow(2,j);/pow(x,y)是一个数学函数,结果是x的y次方。
j++;if(j==k){
int temp=0;
for(i=0;i {
for(j=i;j
if(list[i]>list[j])
数据结构课程设计报告
东莞理工学院城市学院。题目 二叉排序树 专业 计算机科学与技术 本 年级 2010级计算机科学与技术专业 1 班。个人姓名 何振江。指导教师 张娟老师 时间 2010至2011第二学期第18周 地点 实验楼615机房 东莞理工学院城市学院计算机与信息科学系制。2011年 6月。实习报告的内容。一 问...
数据结构课程设计报告
设计一个校园导游程序,为来访的客人提供信息查询服务。1 设计学校的校园平面图。选取若干个有代表性的景点抽象成一个无向带权图 无向网 以图中顶点表示校内各景点,边上的权值表示两景点之间的距离。2 存放景点代号 名称 简介等信息供用户查询。3 为来访客人提供图中任意景点相关信息的查询。4 为来访客人提供...
数据结构课程设计报告
河北科技大学。课程设计报告。学生姓名学号。专业班级。课程名称数据结构。学年学期 2 012 2 013学年第 2 学期指导教师 黄春茹。2 0 13年 6 月。课程设计成绩评定表。一 数据结构课程设计目标。二 问题描述。三 需求分析。四 概要设计。五 详细设计。六 软件说明书 给出软件如何使用,使用...