数据结构与算法课程设计。
题目:集合运算问题。
哈夫曼码的编/译码系统。
方程求解问题。
图的基本操作与实现。
目录 2摘要 3
一.集合运算问题 4
1.采用类语言定义相关的数据类型 4
2.算法设计 4
3.函数的调用关系图 6
4.调试分析 6
5.测试结果 7
6.源程序(带注释) 7
二.哈夫曼码的编/译码系统 11
1. 采用类c语言定义相关的数据类型 12
2.算法设计 12
3.函数调用关系图 13
4.调试分析 14
5.运行结果 14
6.源程序(带注释) 16
三方程求解问题 20
1.采用类语言定义相关的数据类型 20
2.算法设计 20
3.函数的调用关系图 20
4.调试分析 20
5.运行结果 21
6.源程序(带注释) 24
四、图的基本操作与实现 25
1.采用类语言定义相关的数据类型 25
2.算法设计 27
3.函数的调用关系图 27
4.调试分析 27
5.测试结果 27
6.源程序(带注释) 28
总结 37参考文献 38
致谢 38集合运算问题是实现a、b两个集合的并集、交集、差集、显示输出等,要求结果集合中的元素不重复;集合的大小集合的输入形式为以一个“回车符”为结束的字符,实现一个集合的幂集的求解。
哈夫曼码的编/译码系统中)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树及哈夫曼编码。利用已经建好的哈夫曼树,对输入的字符串进行编码,输出编码序列。利用已建好的哈夫曼树对输入的二进制编码进行译码,并输出结果。
用c语言实现方程a5+b5+c5+d5+e5=f5刚好有一个满足0≤a≤b≤c≤d≤e≤f≤75的整数解的问题。也可以将生活中的实际问题转换成此类方程的求解,这样进行程序的迭代和功能的更新,就可以实现更多未知数、更高次、更多解的方程求解问题,和涉及此类方程求解的实际问题。
图的基本操作与实现。创建、求顶点的度数、增加/删除边、判断边是否存在、dfs、bfs、判断是否连通、连通构件的标识,求生成树等。
关键词:集合哈夫曼 c语言迭代递归遍历。
设计一个程序,实现两个集合的并集、交集、差集、显示输出等,要求结果集合中的元素不重复;实现一个集合的幂集的求解。
int a[5];/定义数组a用于存储集合a的元素。
int b[5]; 定义数组b用于存储集合b的元素。
int *p1,*p2;//定义指针p1,p2,使p1指向数组a,p2指向数组p2
p1=&a;
p2=&b;
一交集:首先有两个集合a,b;再建立一个链表,当数组a与数组b内的元素相同时,则把相同的元素放入链表中,然后用output()函数进行输出。
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(*(p1+i)==p2+j))
count++;
c[count-1]=*p1+i);
二差集:首先有两个集合a,b,我确立的关系是集合a减去集合b。该程序用到一个for()循环。当a中的集合和b中元素相同时,则在集合a中把这个元素删除。
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(*(p1+i)!=p2+j))count
if(count%3==0)
c[m]=*p1+i);
m++;}else
count=0;
三并集:首先有两个集合a,b。程序用到一个for()循环。此时比较集合a与集合b的元素,当集合a的一个元素与集合b中的三个元素都不相同时,则把该元素放到链表p1后面(p1=&a)
for(j=0;j<3;j++)
scanf("%d",p2+j);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(*(p1+i)!=p2+j))
count++;
if(count%3==0)
number++;
p2+2+number)=*p1+i);
}elsecount=0;
调试中遇到的问题及对问题的解决方法。
算法的时间复杂度和空间复杂度。
时间复杂度是o(n*m),空间大小是链表的长度n+n+m
#include <>
#include <>
#include <>
#define null 0
#define m 100
*定义链表*/
typedef int elemtype;
typedef struct lnode
elemtype data;
struct lnode *next;
*求交集*/
*时间复杂度是o(n*m*n)(n>=m),空间大小是链表的长度n+m*/
void intersection(struct lnode **l1,struct lnode **l2,struct lnode **l3)
int i,j,k=1;
struct lnode *t1,*t2;
t1=*l1;
t2=*l2;
creat(&*l3);
for(i=1;i<=lenth(&*l1);i++)
t1=t1->next;
t2=*l2;
*求并集*/
*时间复杂度是o(n*m),空间大小是链表的长度n+n+m*/
unionset(struct lnode **l1,struct lnode **l2,struct lnode **l3)
/*把l1复制到l3,然后比较l2与l3,得到l2在l3中没有的元素在l3中的位置,并插入*/
int i,j,k;
struct lnode *tt,*t2,*t3;
creat(&*l3);
copy(&*l1,&*l3);
t2=*l2;
t3=*l3;
for(i=1;i<=lenth(&*l2);i++)
k=1;for(j=1;j<=lenth(&*l3);j++)
if(t2->data==t3->data)
k=0;break;
else if(t2->datadata)
break;
else if(t2->data>t3->data)
k++;if(k<=lenth(&*l3))
t3=t3->next;
/*求差集*/
*时间复杂度是o(n*m),空间大小是链表的长度n+n+m*/
void diffrenceset(struct lnode **l1,struct lnode **l2,struct lnode **l3)
*将第一个复制到第三个,查找第二个在第三个中有的元素,并确定它在第三个中的位置,然后从第三个中删除*/
int i,t,n;
creat(&*l3);
copy(&*l1,&*l3);
for(i=1;i<=lenth(&*l2);i++)
void getpowerset(int i,struct lnode **l1,struct lnode **l2)
else /主函数。
main()
int len1,len2;
char r;
staticstructlnode*head1,*head2,*head3,*head4,*head5,*head6,*head7,*head8;
printf("请输入第一个集合a的大小:")scanf("%d",&len1);
printf("第一个集合a的长度是 %d,请输入 %d 个数据!(用空格隔开):"len1,len1);
init(&head1,len1);
printf("请输入第二个集合b的大小:")scanf("%d",&len2); printf("第二个集合b的长度是 %d,请输入 %d 个数据!(用空格隔开):
"len2,len2);
init(&head2,len2);
intersection(&head1,&head2,&head3);
printf("这两个集合的交集是(a∩b)="display(&head3); printf("");
unionset(&head1,&head2,&head4);
数据结构与算法
本章知识要点 算法的基本概念 数据结构的定义 线性表的定义和存储 树 二叉树的定义和存储 查找与排序算法。算法 algorithm 是一组有穷的规则,规定了解决某一特定类型问题的一系列运算,是对解题方 与完整的描述。算法是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中...
算法与数据结构
学院专业姓名学号。实验1 线性表的操作 12学时 问题描述 假设一个班级内有n个学生,定义一个学生类和一个班级类。学生类中包括学号 姓名 性别 年龄 专业等属性 班级类包括一个学生对象链表。定义如下 class student class myclass student stu head 链表表头指...
算法与数据结构
1 简述算法的概念及其五个重要特性。2 下图是用邻接表存储的图,请画出此图,写出其邻接矩阵以及从c点开始分别按广度优先搜索和深度优先搜索遍历该图的结果。给定一棵用二叉链表表示的二叉树,其根指针为root,编写求此二叉树叶结点个数的算法,要求先写出二叉链表的类型定义。2.编写简单选择排序的算法。1 用...