课程设计.docx
- 文档编号:5806310
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:15
- 大小:121.74KB
课程设计.docx
《课程设计.docx》由会员分享,可在线阅读,更多相关《课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
课程设计
计算机科学与技术学院课程设计成绩单
课程名称:
数据结构课程设计指导教师:
袁嵩
姓名
许淋涛
性别
男
学号
201013136070
班级
网络1002
综合成绩
成绩等级
程序运行情况
(占总成绩20%)
□能正确运行□基本能正确运行□能运行但结果不完善
(20分)(15分)(10分)
程序功能的完善程度
(占总成绩10%)
□完善□基本完善□不完善
(10分)(8分)(5分)
程序结构的合理性
(占总成绩10%)
□合理□基本合理□不太合理
(10分)(8分)(5分)
对问题的答辩情况
(占总成绩40%)
□概念正确有创新□能正确回答所有问题□基本能正确回答
(40分)(35分)(30分)
□部分问题回答概念不清晰
(20分)
学生的工作态度与独立工作能力
(占总成绩10%)
□工作态度认真能独立完成任务□工作态度认真但独立性较差
(10分)(8分)
□工作态度基本认真但缺乏独立性
(5分)
设计报告的规范性
(占总成绩10%)
□符合规范□基本符合规范□规范性较差
(10分)(8分)(5分)
优秀:
90分~100分良好:
80分~89分中等:
70~79分及格:
60~69分不及格0分~59分
武汉科技大学计算机科学与技术学院制表
计算机科学与技术学院
课程设计报告
课程名称:
数据结构课程设计
专业:
网络工程
班级:
2010级1002班
学号:
201013136070
姓名:
许淋涛
指导老师:
袁嵩
一.赫夫曼编码
(1)需求分析:
有两个程序select和HuffmanCoding,首先是用HuffmanCoding创建赫夫曼树的节点,再通过select程序将赫夫曼树的节点之中选出最小的两个。
输出的形式是整形的,输出值范围没有设定。
程序达到的功能是第一次的输出可以将每次的最小两个节点的编号输出,第二次可以将每个叶子节点的赫夫曼编码输出,而且是从最小权值开始依次递增。
(2)详细设计:
本程序中用到的数据结构是HTNode的结构,有一种数据类型,用来存放各个叶子节点的权值,另一种整形是用来存放双亲节点和左右孩子的节点
主程序
intmain()
{
HuffmanTreeHT;//创建一个赫夫曼树
HaffmanCodeHC;//创建一个一组编码的数组
intn,i,j;
int*w;//w用来存放n个权值
printf("请输入赫夫曼数的个数:
\n");
scanf("%d",&n);
w=(int*)malloc(n*sizeof(int));
for(i=0;i { printf("请输入第%d个数: ",i+1); scanf("%d",&w[i]); } HuffmanCoding(HT,HC,w,n); printf("赫夫曼编码为: \n"); for(i=1;i<=n;i++) { printf("%s\n",HC[i]); } system("pause"); return0; } (3)调试分析: 通过这个实验使我对赫夫曼编码有了更深的了解,学会了两种遍历叶子节点赫夫曼编码,一种是由叶子到根,另一种是从根到叶子。 (4)用户手册: 想求出2,3,5,7的赫夫曼编码,可以随便无序的输入,输入一次按enter键,最后将节点的编号输出但不包括顶点的遍号。 (5)调试结果: 6: 附录 #include #include #include #include #include usingnamespacestd; typedefchar**HaffmanCode; typedefstruct { unsignedintweight;//叶子节点的权值。 unsignedintparent,lchild,rchild;//左右孩子及双亲指针 }HTNode,*HuffmanTree; voidSelect(HuffmanTree&HT,inti,int&s1,int&s2) { intn,m=0; for(n=1,m=0;n<=i&&m! =2;n++) { if(HT[n].parent==0) { if(m==0) { s1=n; m=1; continue; } if(m==1) { s2=n; m=2; break; } } } n++; for(;n<=i;n++) { if(HT[n].parent==0) { if(HT[n].weight { if(HT[s1].weight s2=s1; s1=n; continue; } if(HT[n].weight { if(HT[s2].weight s1=s2; s2=n; } } } printf("%d%d\n",s1,s2); } voidHuffmanCoding(HuffmanTree&HT,HaffmanCode&HC,int*w,intn)//创建赫夫曼树 { intm,i,s1,s2,start,c,f; char*code; if(n<=1)return; m=2*n-1; HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(i=1;i<=n;++i) { HT[i].weight=w[i-1]; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for(;i<=m;++i) { HT[i].weight=0; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for(i=n;i { Select(HT,i,s1,s2); HT[s1].parent=i+1; HT[s2].parent=i+1; HT[i+1].lchild=s1; HT[i+1].rchild=s2; HT[i+1].weight=HT[s1].weight+HT[s2].weight; } /*********************************************/ HC=(HaffmanCode)malloc((n+1)*sizeof(char*)); code=(char*)malloc(n*sizeof(char)); code[n-1]='\0'; for(i=1;i<=n;++i)//依次遍历每一个叶子 { start=n-1; for(c=i,f=HT[i].parent;f! =0;c=f,f=HT[f].parent)//从叶子到根遍历获得叶子的赫夫曼编码 if(HT[f].lchild==c)code[--start]='0'; elsecode[--start]='1'; HC[i]=(char*)malloc((n-start)*sizeof(char)); strcpy(HC[i],&code[start]);//从cd复制编码到HC } free(code); } intmain() { HuffmanTreeHT;//创建一个赫夫曼树 HaffmanCodeHC;//创建一个一组编码的数组 intn,i,j; int*w;//w用来存放n个权值 printf("请输入赫夫曼数的个数: \n"); scanf("%d",&n); w=(int*)malloc(n*sizeof(int)); for(i=0;i { printf("请输入第%d个数: ",i+1); scanf("%d",&w[i]); } HuffmanCoding(HT,HC,w,n); printf("赫夫曼编码为: \n"); for(i=1;i<=n;i++) { printf("%s\n",HC[i]); } system("pause"); return0; } 二.多叉路口交通灯的管理 (1)需求分析: 任务: 将书本上的13个路口着色,可以一起通行的填上相同的数字并按二维数字输出。 在此程序中无输人,函数中已包含输入。 (2)详细设计: 本程序用到的是vexnode的class类, 流程图 (3)测试结果: (4)附录: #include #include #include #include #include #include usingnamespacestd; classvexnode//头结点 { public: intvexnum;//顶点编号 stringvexname;//顶点名,如AB、BC、ED intvexcolor;//顶点颜色编号 list intcolor(){returnvexcolor;}//返回头结点的颜色的成员函数 vexnode(intnum,stringname,intcolor=0/*表示未着色*/) {//默认构造函数 vexnum=num; vexname=name; vexcolor=color; } }; intDrawColor(vector { //使用节约算法对交通图着色 //根据P阶图总是P可着色的,故总颜色集合中的颜色等于thegraph图中点顶数加1 //加1的原因是为运行时避免超出范围的考虑 set intj=thegraph.size()+1; for(inti=1;i<=j;i++) { allcolorset.insert(i); } //以下逐一对顶点着色 vector : iteratorpos; for(pos=thegraph.begin();pos! =thegraph.end();pos++) { if(! ((*pos).firstarc.empty()))//如果存在邻接点 { //1、求此顶点的邻接点的着色集合colorset set list : iteratorlistpos; for(listpos=(*pos).firstarc.begin();listpos! =(*pos).firstarc.end();++listpos) { colorset.insert(thegraph[*listpos].vexcolor); } //2、使用标准模板库中的set_difference算法求allcolorset与colorset的差集maybecolorset set_difference(allcolorset.begin(),allcolorset.end(),colorset.begin(),colorset.end(),maybecolorset.begin()); //3、给此顶点着maybecolorset中编号最小的颜色,注: maybecolorset是己序的 (*pos).vexcolor=*(maybecolorset.begin()); //取集合maybecolorset中的最小元素值附给顶点的颜色域 }//if } //以下将图中没有着色的顶点(即没有邻接点的顶点)全部着1号色 for(pos=thegraph.begin();pos! =thegraph.end();pos++) { if(((*pos).vexcolor)==0)(*pos).vexcolor=1; } return0; }; intdisplay(vector {//显示交通图的着色 vector : iteratorpos; cout<<"顶点编号"<<'\t'<<"顶点名"<<'\t'<<'\t'<<"所着颜色"< for(pos=thegraph.begin();pos! =thegraph.end();pos++) {//分别打印出顶点编号、顶点名和顶点颜色 cout<<(*pos).vexnum<<'\t'<<'\t'<<(*pos).vexname<<'\t'<<'\t'<<(*pos).vexcolor< } return0; }; intmain() { vector /*以下初始化交通图,本处以严蔚敏《数据结构》教材第二版绪论中的图1.3关于五叉路口交通管理图为例进行初始化*/ traffic_graph.push_back(vexnode(0,"AB")); traffic_graph.push_back(vexnode(1,"AC")); traffic_graph.push_back(vexnode(2,"AD")); traffic_graph.push_back(vexnode(3,"BA")); traffic_graph.push_back(vexnode(4,"BC")); traffic_graph.push_back(vexnode(5,"BD")); traffic_graph.push_back(vexnode(6,"DA")); traffic_graph.push_back(vexnode(7,"DB")); traffic_graph.push_back(vexnode(8,"DC")); traffic_graph.push_back(vexnode(9,"EA")); traffic_graph.push_back(vexnode(10,"EB")); traffic_graph.push_back(vexnode(11,"EC")); traffic_graph.push_back(vexnode(12,"ED")); /*以下为交通图加入边,,编号次序是按顶点次序从0开始,从上至下从左至右, 或者说与上面加入到交通图中的次序一致*/ traffic_graph[0].firstarc.push_back(9); traffic_graph[0].firstarc.push_back(6); traffic_graph[0].firstarc.push_back(4); traffic_graph[0].firstarc.push_back(5); traffic_graph[1].firstarc.push_back(9); traffic_graph[1].firstarc.push_back(6); traffic_graph[1].firstarc.push_back(10); traffic_graph[1].firstarc.push_back(7); traffic_graph[1].firstarc.push_back(5); traffic_graph[2].firstarc.push_back(9); traffic_graph[2].firstarc.push_back(10); traffic_graph[2].firstarc.push_back(11); traffic_graph[4].firstarc.push_back(0); traffic_graph[4].firstarc.push_back(10); traffic_graph[4].firstarc.push_back(7); traffic_graph[5].firstarc.push_back (1); traffic_graph[5].firstarc.push_back(0); traffic_graph[5].firstarc.push_back(6); traffic_graph[5].firstarc.push_back(10); traffic_graph[5].firstarc.push_back(11); traffic_graph[6].firstarc.push_back(0); traffic_graph[6].firstarc.push_back (1); traffic_graph[6].firstarc.push_back(5); traffic_graph[6].firstarc.push_back(11); traffic_graph[6].firstarc.push_back(10); traffic_graph[7].firstarc.push_back(4); traffic_graph[7].firstarc.push_back (1); traffic_graph[7].firstarc.push_back(11); traffic_graph[9].firstarc.push_back(0); traffic_graph[9].firstarc.push_back (1); traffic_graph[9].firstarc.push_back (2); traffic_graph[10].firstarc.push_back(6); traffic_graph[10].firstarc.push_back(4); traffic_graph[10].firstarc.push_back (1); traffic_graph[10].firstarc.push_back(5); traffic_graph[10].firstarc.push_back (2); traffic_graph[11].firstarc.push_back(6); traffic_graph[11].firstarc.push_back(7); traffic_graph[11].firstarc.push_back(5); traffic_graph[11].firstarc.push_back (2); //以上初始化完毕 DrawColor(traffic_graph);//着色 display(traffic_graph);//打印 return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计