数据结构 课程设计

来源:百度文库 编辑:神马文学网 时间:2024/05/15 08:53:32
二、   课程设计内容
设计一个程序,该程序具有下面功能:
(1)能够选择合适的排序算法,如插入排序、归并排序或快速排序,依据该算法对某一数组进行排序,计算完成该操作所需时间。
(2)Huffman编码和解码。
程序界面如下:
1、主界面
------------------------------------------------------------------------
1.排序
2.Huffman编码和解码
3.退出
请选择操作类型(1—3):
------------------------------------------------------------------------
2、排序界面
------------------------------------------------------------------------
1.插入排序
2.归并排序
3.快速排序
4.返回
5.退出
请选择操作类型(1—5):
------------------------------------------------------------------------
是否打印排序前数组(Y/N):
是否打印排序后结果(Y/N):
排序所花时间:(按任意键返回)
3、编码解码界面
请输入字符串:
编码结果为:
解码结果为:(按任意键返回)
三、   课程设计要求
1、课程设计的程序必须用C/C++语言完成。
2、关键算法必须画出流程图。
3、要求写出软件分析和设计。分析部分包括功能需求和界面需求;设计部分包括算法的详细设计和数据结构(包括内存数据结构和文件结构)。
四、    需求分析和模块设计
1、需求分析
程序要完成两大功能:一为内排序,二为Huffman编码与解码。而其中的排序又由三种方法实现,一是插入排序;二是归并排序;三是快速排序。
2、模块分解
把程序分成六大模块,分别是主界面,排序界面,插入排序,归并排序,快速排序,Huffman编码与解码。
3、详细设计
注:这部分对每个函数的功能进行定义,方式如下:
函数名称:menu( )  编号:001
函数功能:实现主界面
输入参数:无
输出参数:无
返回值:无
数据流程图
-------------------------------------------------------------------------------------------------------
函数名称:sort( )  编号:002
函数功能:实现排序面
输入参数:无
输出参数:无
返回值:无
数据流程图
-------------------------------------------------------------------------------------------------------
函数名称:inssort( )  编号:003
函数功能:实现插入排序
输入参数:要排序数组地址,数组长度
输出参数:无
返回值:无
数据流程图
-------------------------------------------------------------------------------------------------------
函数名称:msort( )  编号:004
函数功能:实现归并排序
输入参数:要排序数组地址,临时数组地址,数组最左边位置,数组最右边位置,
输出参数:无
返回值:无
数据流程图
-------------------------------------------------------------------------------------------------------
函数名称:quicksort( )  编号:005
函数功能:实现快速排序
输入参数:要排序数组地址,数组最左边位置,数组最右边位置,
输出参数:无
返回值:无
函数名称:huff( )  编号:006
函数功能:实现Huffman编码与解码
输入参数:建树的字符个数,字符和它的权值
输出参数:无
返回值:无
4、数据结构
插入排序:L
i=1   2   3  4   5   6   7
42 20 17 13 13 13 13 13
20 42 20 17 17 14 14 14
17 17 42 20 20 17 17 15
13 13 13 42 28 20 20 17
28 28 28 28 42 28 23 20
14 14 14 14 14 42 28 23
23 23 23 23 23 23 42 28
15 15 15 15 15 15 15 42
快速排序:
72 6 57 88 60 42 83 73 48 85
Pivot=60
48 6 57 42 60 88 83 73 72 85
Pivot=6              Pivot=73
6 42 57 48   72 73 85 88 83
Pivot=57             Pivot=88
42 48    57   85 83 88
Pivot=42              Pivot=85
42 48   83 85
6 42 48 57 60 72 73 83 85 88
最终排好序的数组
归并排序:
36 20 17 13 28 14 23 15
20 36 13 17 14 28 15 23
13 17 20 36 14 15 23 28
13 14 15 17 20 23 28 36
五、    计中碰到的问题及解决方法
程序的要求是要进行一个操作后要返回原界面或主界面,我用的是switch的结构,和老师给的有所不同,所以在处理这个问题时出了一点问题,但后来一想,也很简单,再调用一次原来的界面函数不就行了吗?
六、   收获和体会
通过这次课程实践,我加深了对数据结构这门课程的理解,更好的掌握了各种排序方法和Huffman编码与解码!更巩固了自己的C和C++的知识。
七、   程序清单
主界面:
DS,cpp
#include "stdafx.h"
#include
#include
void sort();//声明要调用的函数
void huff();
void menu()
{
int num;
cout <cout <cout <cout <cout <cout <>num;cout <switch(num)// 通过swich语句进行选择
{
case 1: sort();break;
case 2: huff();break;
case 3: break;
default: cout <<"error";
}
}
void main()
{
menu();
}
排序界面:
Sort.cpp
#include "stdafx.h"
#include
#include
void inssort();/ //首先要声明各个要调用的函数/
void menu();
void msort();
void qsort();
void sort() / 类似于主界面,也通过switch语句进行选择/
{
int num1;
cout <cout <cout <cout <cout <cout <cout <cout <>num1;cout <switch(num1)
{
case 1: inssort();break;
case 2: msort();break;
case 3: qsort();break;
case 4: menu();break;
case 5: break;
default: cout <<"error";
}
}
插入排序:
Inssort.cpp
#include "stdafx.h"
#include
#include "stdio.h"
int time1=0;
int comp(int a,int b);//比较
void swap(int a[],int x,int y); //交换
void sort();//排序界面
void inssort1(int A[],int n)//进行插入排序
{
for(int i=0;ifor(int j=i;(j>0)&&(comp(A[j],A[j-1]));j--)
swap(A,j,j-1);
}
int comp(int a,int b)
{
int result;
if(a>b)
result=1;
else
result=0;
return result;
time1++;
}
void swap(int a[],int x,int y)
{
int temp;
temp=a[x];
a[x]=a[y];
a[y]=temp;
time1++;
}
void inssort()
{
int n;
int A[80],B[80];
cout <<"请输入你要输入的元素个数:" <cin >>n;
cout <<"请输入要排序的元素:" <for(int i=0;i{
cin >>A[i];
}
for(int j=0;j{
B[j]=A[j];
}
cout <<"进行排序后的结果:" <inssort1(A,n);//进行插入排序
for(int k=0;k{
cout <}
cout <cout <<"时间复杂度为: ";
cout <char answer;
cout <<"是否要打印排序前的数组?(y/n)" <cin >>answer;
if(answer=='y')
{
for(int ii=0;iicout <}
cout <getchar();
sort();
}
归并排序:
Mergesort.cpp
#include "stdafx.h"
#include
#include "stdio.h"
void inssort1(int A[],int n);
int time2=0;//时间复杂度
extern int time1;
void sort();
void mergesort(int A[],int temp[],int left,int right)
{     if((right-left)<=32)
{
inssort1(&A[left],right-left+1);//对于较小的数组,调用内排序
return;
}
int i,j,k,mid=(left+right)/2;
if(left==right) return;
mergesort(A,temp,left,mid);
mergesort(A,temp,mid+1,right);
for(i=mid;i>=left;i--)
{
temp[i]=A[i];
time2++;
}
for(j=1;j{
temp[right-j+1]=A[j+mid];
time2++;
}
for(i=left,j=right,k=left;k<=right;k++)
{
if(temp[i]<=temp[j])
{
A[k]=temp[i++];
time2++;
}
else
{
A[k]=temp[j--];
time2++;
}
}
}
void msort()
{
int n,left,right;
int time;
int A[80];
int B[80];
int temp[80];
cout <<"请输入元素个数:" <cin >>n;
left=0;
right=n-1;
cout <<"请输入数组元素:" <for(int i=0;i{
cin >>A[i];
}
for(int j=0;j{
B[j]=A[j];
}
mergesort(A,temp,left,right);//进行归并排序
cout <<"进行排序后的结果:" <for(int k=0;k{
cout <
}
cout <time=time1+time2;
cout <<"时间复杂度为: ";
cout <
cout <cout <<"时间复杂度为:" <cout <<"是否打印排序前的数组?(y/n)";
cin >>answer;
if(answer=='y')
{
for(int k=0;k{
cout <}
}
cout <getchar();
sort();
}
Huffman编码:
Huff.cpp
#include "stdafx.h"
#include
#include "stdio.h"
#include "string.h"
#define MAX 99
char cha[MAX];
char hc[MAX-1][MAX];
int s1,s2; //设置全局变量,以便在方法(函数)select中返回两个变量
void menu();
typedef struct //huffman树存储结构
{
unsigned int wei;
int lch,rch,parent;
}hufftree;
void select(hufftree tree[],int k) //找寻parent为0,权最小的两个节点
{
int i;
for (i=1;i<=k && tree[i].parent!=0 ;i++); s1=i;
for (i=1;i<=k;i++)
if (tree[i].parent==0 && tree[i].weifor (i=1; i<=k ; i++)
if (tree[i].parent==0 && i!=s1) break; s2=i;
for (i=1;i<=k;i++)
if ( tree[i].parent==0 && i!=s1 && tree[i].wei}
void huffman(hufftree tree[],int *w,int n) //生成huffman树
{ int m,i;
if (n<=1) return;
m=2*n-1;
for (i=1;i<=n;i++)
{
tree[i].wei=w[i];
tree[i].parent=0;
tree[i].lch=0;
tree[i].rch=0;
}
for (i=n+1;i<=m;i++)
{
tree[i].wei=0;
tree[i].parent=0;
tree[i].lch=0;
tree[i].rch=0;
}
for (i=n+1;i<=m;i++)
{
select(tree, i-1);
tree[s1].parent=i;
tree[s2].parent=i;
tree[i].lch=s1;
tree[i].rch=s2;
tree[i].wei=tree[s1]. wei+ tree[s2].wei;
}
}
void huffmancode(hufftree tree[],char code[],int n)
{
int start,c,i,f;
code[n-1]='\0';
cout <<"Huffman编码:" <for(i=1;i<=n;i++)
{
start=n-1;
for(c=i,f=tree[i].parent;f!=0;c=f,f=tree[f].parent)
{
if(tree[f].lch==c)
code[--start]='0';
else
code[--start]='1';
}
strcpy(hc[i],&code[start]);
cout <" <}
}
void tohuffmancode(int n)
{
int i=0,j;
char anychar[9999];
cout <<"请输入一段字符:" <cin >>anychar;
cout <<"进行Huffman编码后的结果为:" <for (;anychar[i]!='\0';i++)
{
j=0;
for(;anychar[i]!=cha[j]&&j<=n;)
j++;
if (j<=n)
cout <}
cout <}
void decode(char ch[],hufftree tree[],int n)
{
int i,j,m;
char b;
m=2*n-1;
i=m;
cout <<"请输入你要解码的编码:" <cin >>b;
cout <<"解码结果为:" <while(b!='#')   //遇到回车时,结束
{
if(b=='0')
i=tree[i].lch;
else
i=tree[i].rch;
if(tree[i].lch==0)
{
cout <j=i,i=m;
}
cin >>b;
}
if(tree[j].lch!=0)
cout <<"发生错误!!";
}
void huff()
{
int i=0,n=0;
int *w,wei[MAX];
char code[MAX];
hufftree tree[MAX];
w=wei;
cout <<"请输入n(n为你要建树的字符个数):" <cin >>n;
cout <<"请输入字符和它的权值(例如:a20):" <for(i=1;i<=n;i++)
{
cin >>cha[i] >>wei[i];
}
huffman(tree,w,n);   //生成huffman树
huffmancode(tree,code,n); //编码A
tohuffmancode(n);//编码B
decode(cha,tree,n); //译码
cout <<"按任意键返回";
getchar();
menu();
}
发表于 @ 2006年04月16日 23:21:00 | 评论( 1 ) | 编辑| 举报| 收藏
旧一篇:操作系统课程设计指导书 | 新一篇:C盘空间无故减少之迷
查看最新精华文章 请访问博客首页相关文章keaimao2525 发表于2009年6月17日 10:21:25  IP:举报回复删除
正好用到 借走了 谢谢~~O(∩_∩)O~发表评论表 情:          评论内容: 用 户 名:登录 注册 匿名评论 匿名用户验 证 码:  重新获得验证码
热门招聘职位【Synopsys】全球知名EDA软件设计公司,诚聘 C/C++/IC Engineer【热聘】搜狐畅游全国热招开发工程师【网易杭州】技术类职位大招聘:c++、java、信息安全工程师等职位热招中【天元网络】高薪诚聘研发经理/项目经理/JAVA/.NET/无线网优人才【南天信息】诚聘.NET工程师/软件开发工程师,月薪+奖金+五险一金【浩辰CAD】国产CAD第一品牌 高薪诚聘 高级VC++开发职位【麒麟游戏】倾情招聘募游戏研发人员,共建麒麟家园!【百度】诚聘 Web研发/工程师 一个舞台,让你的想法去成为现实!!!【上海我友】福利购房计划+高薪+期权,邀您共创互联网的奇迹!【NHN China】诚聘QA工程师/软件开发工程师, 急聘!高薪诚聘!【并擎软件】微软高级技术专家诚邀开发人员共同创业【神灯网络】年薪20万!诚聘DELPHI高级项目经理!【Synopsys】全球知名EDA软件设计公司,诚聘 C/C++/IC Engineer【热聘】搜狐畅游全国热招开发工程师【网易杭州】技术类职位大招聘:c++、java、信息安全工程师等职位热招中【天元网络】高薪诚聘研发经理/项目经理/JAVA/.NET/无线网优人才【南天信息】诚聘.NET工程师/软件开发工程师,月薪+奖金+五险一金【浩辰CAD】国产CAD第一品牌 高薪诚聘 高级VC++开发职位【麒麟游戏】倾情招聘募游戏研发人员,共建麒麟家园!【百度】诚聘 Web研发/工程师 一个舞台,让你的想法去成为现实!!!【上海我友】福利购房计划+高薪+期权,邀您共创互联网的奇迹!【NHN China】诚聘QA工程师/软件开发工程师, 急聘!高薪诚聘!【并擎软件】微软高级技术专家诚邀开发人员共同创业【神灯网络】年薪20万!诚聘DELPHI高级项目经理! 公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
江苏乐知网络技术有限公司 提供商务支持
Email:webmaster@csdn.net
Copyright © 1999-2010, CSDN.NET, All Rights Reserved
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hqok/archive/2006/04/16/665991.aspx