山东建筑大学计算机科学与技术学院.docx
- 文档编号:9721882
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:25
- 大小:71.21KB
山东建筑大学计算机科学与技术学院.docx
《山东建筑大学计算机科学与技术学院.docx》由会员分享,可在线阅读,更多相关《山东建筑大学计算机科学与技术学院.docx(25页珍藏版)》请在冰豆网上搜索。
山东建筑大学计算机科学与技术学院
山东建筑大学计算机科学与技术学院
课程设计说明书
题目:
赫夫曼树的建立
校园导航系统
学生搭配问题
课程:
数据结构
院(部):
计算机科学与技术学院
专业:
计算机科学与技术
班级:
计科063
学生姓名:
唐凝
学号:
2006111083
指导教师:
张冬梅
完成日期:
2008-07-6
目录
课程设计任务书一I
课程设计任务书二II
课程设计任务书三III
赫夫曼树的建立1
一、问题描述1
二、基本要求1
三、算法思想1
四、数据结构1
五、模块划分2
六、源程序2
七、测试数据4
八、测试情况5
校园导航系统6
一、问题描述6
二、基本要求6
三、算法思想6
四、数据结构6
五、模块划分6
六、源程序7
七、测试数据11
八、测试情况11
学生搭配问题12
一、问题描述12
二、基本要求12
三、算法思想12
四、数据结构12
五、模块划分12
六、源程序13
七、测试数据17
八、测试情况17
结论18
参考文献19
课程设计指导教师评语20
山东建筑大学计算机科学与技术学院
课程设计任务书一
设计题目
赫夫曼树的建立
已知技术参数和设计要求
任务:
建立最优二叉树函数
要求:
可以建立函数输入二叉树,并输出其赫夫曼树
在上交资料中请写明:
存储结构、基本算法(可以使用程序流程图)、输入输出、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
设计内容与步骤
1、结点结构的设计
2、算法设计与分析
3、程序设计、实现、调试
4、课程设计说明书
设计工作计划与进度安排
1、设计工作4学时
2、实现与调试16学时
3、课程设计说明书8学时
设计考核要求
1、考勤20%
2、课程设计说明书50%
3、成果展示30%
山东建筑大学计算机科学与技术学院
课程设计任务书二
设计题目
校园导航系统
已知技术参数和设计要求
设计要求:
设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。
设计内容与步骤
1、结点结构的设计
2、算法设计与分析
3、程序设计、实现、调试
4、课程设计说明书
设计工作计划与进度安排
1、设计工作4学时
2、实现与调试16学时
3、课程设计说明书8学时
设计考核要求
1、考勤20%
2、课程设计说明书50%
3、成果展示30%
山东建筑大学计算机科学与技术学院
课程设计任务书三
设计题目
学生搭配问题
已知技术参数和设计要求
一班有m个女生,有n个男生(m不等于n),现要开一个舞会.男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞,本曲没成功配对者坐着等待下一曲找舞伴.
请设计一系统模拟动态地显示出上述过程,要求如下:
1、输出每曲配对情况
2、计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值.
3、尽量设计出多种算法及程序,可视情况适当加分
提示:
用队列来解决比较方便.
设计内容与步骤
1、结点结构的设计
2、算法设计与分析
3、程序设计、实现、调试
4、课程设计说明书
设计工作计划与进度安排
1、设计工作4学时
2、实现与调试16学时
3、课程设计说明书8学时
设计考核要求
1、考勤20%
2、课程设计说明书50%
3、成果展示30%
指导教师(签字):
教研室主任(签字)
赫夫曼树的建立
一、问题描述
建立最优二叉树函数
二、基本要求
可以建立函数输入二叉树,并输出其赫夫曼树
三、算法思想
(1)初始化:
由给定的n个权值{w1,w2,…,wn}构造n棵只有一个根结点的二叉树,从而得到一个二叉树集合F={T1,T2,…,Tn};
(2)选取与合并:
在F中选取根结点的权值最小的两棵二叉树分别作为左右子树构造一棵新的二叉树,这棵新二叉树的根结点的权值为其左右子树根结点的权值之和;
(3)删除与加入:
在F中删除作为左右子树的两棵二叉树,并将新建立的二叉树加入到E中;
(4)重复
(2)、(3)两步,当集合F中只剩下一棵二叉树时,这棵二叉树便是赫夫曼。
叶子结点权值为W={2,3,4,5}的赫夫曼树的构造过程。
四、数据结构
typedefstructHuffmanTreeNode
{charch,code[20];
intweight;
intparent,lchild,rchild;
}HTNode,*HuffmanTree;
typedefstruct
{HTNodearr[Max_Node];
inttotal;
}HTree;
五、模块划分
1、函数
intstatistic_char(char*text,HTree*t)
计算个字符出现的频率,把频率当作权值
intcreate_htree(HTree*t)
创建赫夫曼树
voidprint_htree_ldr(HTree*t,inthead_i,intdeep,int*path)
打印赫夫曼树
intmain()
主函数
2、函数间的调用关系
主函数调用statistic_char函数create_htree函数print_htree_ldr函数
六、源程序
intstatistic_char(char*text,HTree*t)
{
inti,j;
inttext_len=strlen(text);
t->total=0;
for(i=0;i {for(j=0;j if(t->arr[j].ch==text[i]) { t->arr[j].weight++; break;} if(j==t->total) { t->arr[t->total].ch=text[i]; t->arr[t->total].weight=1; t->total++;} } printf("各字符的出现频率分别为\n"); for(i=0;i printf("'%c'%d\n",t->arr[i].ch,t->arr[i].weight); printf("\n"); returnt->total; } intcreate_htree(HTree*t) { inti; inttotal_node=t->total*2-1; intmin1,min2; intmin1_i,min2_i; intleaves=t->total; for(i=0;i {t->arr[i].parent=-1; t->arr[i].rchild=-1; t->arr[i].lchild=-1;} while(t->total {min1=min2=Max_Weight; for(i=0;i {if(t->arr[i].parent==-1&&t->arr[i].weight {if(t->arr[i].weight {min2_i=min1_i;min2=min1; min1_i=i;min1=t->arr[i].weight;} else {min2_i=i;min2=t->arr[i].weight;}}} t->arr[t->total].weight=min1+min2; t->arr[t->total].parent=-1; t->arr[t->total].lchild=min1_i; t->arr[t->total].rchild=min2_i; t->arr[min1_i].parent=t->total; t->arr[min2_i].parent=t->total; t->arr[t->total].ch=''; t->total++;} return0; } voidprint_htree_ldr(HTree*t,inthead_i,intdeep,int*path) {inti; if(head_i==-1)return; path[deep]=0; print_htree_ldr(t,t->arr[head_i].lchild,deep+1,path); if(deep)printf(""); for(i=1;i printf("%s",path[i]==path[i-1]? "": "│"); intdir=path[i]==path[i-1]; if(t->arr[head_i].lchild==-1&&t->arr[head_i].rchild==-1) printf("%s——%d'%c'\n",dir? "┌": "└", t->arr[head_i].weight,t->arr[head_i].ch); elseif(head_i! =t->total-1) printf("%s—%02d┤\n",dir? "┌": "└",t->arr[head_i].weight); else printf("%02d┤\n",t->arr[head_i].weight); path[deep]=1; print_htree_ldr(t,t->arr[head_i].rchild,deep+1,path); } intmain() {HTreet; chartext[128]={0}; printf("请输入你需要处理的字符串: "); gets(text); charcode[128]=""; intpath[16]={0}; statistic_char(text,&t); create_htree(&t); print_htree_ldr(&t,t.total-1,0,path); return0; } 七、测试数据 输入字符串: wo20sd42 八、测试情况 校园导航系统 一、问题描述 设计学校平面图,求任意场所的最佳路径。 二、基本要求 设计你的学校的平面图,至少包括10个以上的场所,每两个场所间可以有不同的路,且路长也可能不同,找出从任意场所到达另一场所的最佳路径(最短路径)。 三、算法思想 floyed算法求两个景点的最短路径 用邻接矩阵存储图 四、数据结构 定义全局变量 intcost[n][n];边的值 intshortest[n][n];两点间的最短距离 intpath[n][n];经过的景点 五、模块划分 voiddisplay(inti,intj) 打印两个景点的路径及最短距离 voidfloyed() 用floyed算法求两个景点的最短路径 intshortestdistance() 要查找的两景点的最短距离 voidintroduce() 对景点的介绍 六、源程序 voiddisplay(inti,intj) {inta,b; a=i; b=j; printf("您要查询的两景点间最短路径是: \n\n"); if(shortest[i][j]! =INT_MAX) {if(i {printf("%d",b); while(path[i][j]! =0) {printf("<-%d",path[i][j]); if(i elsei=path[j][i];} printf("<-%d",a); printf("\n\n"); printf("(%d->%d)最短距离是: %d米\n\n",a,b,shortest[a][b]);} else {printf("%d",a); while(path[i][j]! =0) {printf("->%d",path[i][j]); if(i elsei=path[j][i];} printf("->%d",b); printf("\n\n"); printf("(%d->%d)最短距离是: %5d米\n\n",a,b,shortest[a][b]);} } elseprintf("输入错误! 不存在此路! \n\n"); printf("\n"); } voidfloyed() {inti,j,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++) {shortest[i][j]=cost[i][j]; path[i][j]=0;} for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(shortest[i][j]>(shortest[i][k]+shortest[k][j])) {shortest[i][j]=shortest[i][k]+shortest[k][j]; path[i][j]=k; path[j][i]=k;} } intshortestdistance() {inti,j; printf("请输入要查询的两个景点的编号(1->10的数字编号并用','间隔): "); scanf("%d,%d",&i,&j); if(i>n||i<=0||j>n||j<0) {printf("输入信息错误! \n\n"); printf(" 请输入要查询的两个景点的编号(1->10的数字编号并用','间隔): \n"); scanf("%d,%d",&i,&j);} else {floyed(); display(i,j);} return1; } voidintroduce() {inta; printf("您想查询哪个景点的详细信息? 请输入景点编号: "); scanf("%d",&a); getchar(); printf("\n"); switch(a) {case1: printf("1: 月泉广场\n\n 学校的正门,高大宽敞,气势宏伟。 \n\n");break; case2: printf("2: 行政楼,外文馆\n\n 学校行政办公的主楼,外国语学院,视听说教室。 \n\n");break; case3: printf("3: 建艺馆\n\n建筑成规、艺术学院,配有画室,设计独特。 n\n");break; case4: printf("4: 图书馆,报告厅\n\n 学校信息资源中心,内设大量的自习室,和报告厅相连。 \n\n");break; case5: printf("5: 博文楼\n\n 学校主教学楼,以多媒体教室为主,大教室较多。 \n\n");break; case6: printf("6: 科学楼\n\n 实验楼和计算中心。 \n\n");break; case7: printf("7: 映雪湖\n\n 湖面平静开阔,湖边有垂柳环绕,景色优美,可供休息。 \n\n");break; case8: printf("8: 食堂,超市\n\n 为学生提供日常生活所需,品种齐全。 \n\n");break; case9: printf("9: 宿舍区n\n学生宿舍楼住区,分为松、竹、梅三区。 \n\n");break; case10: printf("10: 体育场\n\n 学生上体育课及运动的场地,设有体育馆、田径场、足球场、篮球场、网球场等。 \n\n");break; default: printf("景点编号输入错误! 请输入1->10的数字编号! \n\n");break; } } voidmain() {inti,j; chark; for(i=0;i<=n;i++) for(j=0;j<=n;j++) cost[i][j]=INT_MAX; cost[1][2]=cost[2][1]=20; cost[1][3]=cost[3][1]=15; cost[1][4]=cost[4][1]=150; cost[2][4]=cost[4][2]=180; cost[2][5]=cost[5][2]=25; cost[5][6]=cost[6][5]=280; cost[6][7]=cost[7][6]=100; cost[6][8]=cost[8][6]=120; cost[7][8]=cost[8][7]=80; cost[8][9]=cost[9][8]=50; cost[9][10]=cost[10][9]=60; cost[4][7]=cost[7][4]=800; cost[1][1]=cost[2][2]=cost[3][3]=cost[4][4]=cost[5][5]=0; cost[6][6]=cost[7][7]=cost[8][8]=cost[9][9]=cost[10][10]=0; while (1) { printf("----------------欢迎使用山东建筑大学导游系统! ----------------\n"); printf("1.景点信息查询………请按i(introduc)键\n"); printf("2.景点最短路径查询…请按s(shortestdistance)键\n"); printf("3.退出系统……………请按e(exit)键\n"); printf("学校景点列表: \n"); printf("1: 月泉广场,学校正门"); printf("2: 行政楼,外文馆"); printf("3: 建艺馆"); printf("4: 图书馆,报告厅"); printf("5: 博文楼\n"); printf("6: 科学楼"); printf("7: 映雪湖"); printf("8: 食堂,超市"); printf("9: 宿舍区"); printf("10: 体育场\n"); printf("请选择服务: "); scanf("\n%c",&k); switch(k) {case'i': printf("进入景点信息查询: "); introduce(); break; case's': printf("进入最短路径查询: "); shortestdistance(); break; case'e': exit(0); default: printf("输入信息错误! \n请输入字母i或s或e.\n"); break;} } } 七、测试数据 1、从景点1(月泉广场)到景点8(食堂)所经过的景点及最短距离。 2、查询景点7(映雪湖)的介绍。 3、退出服务。 八、测试情况 学生搭配问题 一、问题描述 一班有m个女生,有n个男生(m不等于n),现要开一个舞会.男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞,本曲没成功配对者坐着等待下一曲找舞伴. 二、基本要求 1、输出每曲配对情况 2、计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值. 3、尽量设计出多种算法及程序,可视情况适当加分 三、算法思想 使用队列解决问题 男生女生各一个循环队列 四、数据结构 typedefstructQNode{ intdata; structQNode*next; }QNode,*QueuePtr; typedefstruct{ QueuePtrfront; QueuePtrrear; }LinkQueue; LinkQueuegirl,boy,music; 五、模块划分 1、函数 intEnQueue(LinkQueue&Q,intn) 向队列中插入元素 intDeQueue(LinkQueue&Q,int&bridge) 删除队头元素 intReadQFM(LinkQueue&Q) 获取队头元素 intReadQFG(LinkQueue&Q) 获取队头元素 intReadQFB(LinkQueue&Q) 获取队头元素 intmain() 主函数 六、源程序 intbridgegirl,bridgeboy,bridgemusic; typedefstructQNode{ intdata; structQNode*next; }QNode,*QueuePtr; typedefstruct{ QueuePtrfront; QueuePtrrear; }LinkQueue; LinkQueuegirl,boy,music; init(LinkQueue&Q) {Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(! Q.front)exit(OVERFOLLOW); Q.front->data=NULL; returnOK; intEnQueue(LinkQueue&Q,intn) { QueuePtrp=(QueuePtr)malloc(sizeof(QNode)); if(! p)exit(OVERFOLLOW); p->data=n; p->next=NULL; Q.rear->next=p; Q.rear=p; returnOK;} intDeQueue(LinkQ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东 建筑 大学计算机 科学 技术学院