数据结构实践报告格式2.docx
《数据结构实践报告格式2.docx》由会员分享,可在线阅读,更多相关《数据结构实践报告格式2.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构实践报告格式2
苏州科技学院
电子与信息工程学院
《数据结构程序设计》报告
学号1032107204
姓名潘俊泽
班级1022
日期2011年7月
实践报告3
学号____1032107204______姓名__潘俊泽_________班级_______1022______
一、实验目的:
熟悉数据结构,培养良好的程序设计能力
二、实验内容:
管道铺设施工的最佳方案选择
三、设计说明:
写出数据结构的定义
四、连通网络可采用邻接矩阵存储,以顶点对(i,j)的形式输出最小生成树的边。
测试数据如教材p2图1.2(a)所示。
(难度系数为4)
五、功能说明:
说明本程序中的每一个函数及其功能。
管道铺设信息的输入;
最小生成树信息的输出;
功能模块图:
3.抽象数据类型分析
areanum居民区总数(顶点总数);
edgenum边的总数;
date[][20]邻接矩阵存储图结构;
s边的权值;
short-way[i]居民区i到目前生成树中所有点集U中某个居民区的路程最小值
near-area[i]U中能使其最小的居民区
1.全部流程
五、详细设计
1.算法分析
信息输入模块
//读入图的信息,并将邻接矩阵输出
Voidread()
{//输入顶点个数和边的条数
Printf(“请输入:
定点数,变数:
\n”);
Scanf(“%d,%d”,&areanum,&dedgenm);
//初始化邻接矩阵各元素值
Inti,j,k;
for(i=0;ifor(j=0;jdate[i][j]=INFINITY;//读入边Intfrom,to,s;Printf(“输入边,格式为i,j,k,表示i到j的权值是k:\n”);For(i=0;i{Scanf(“%d,%d,%d”,&from,&to,&s);date[from][to]=s;date[to][from]st;}//输出邻接矩阵for(i=0;i{for(j=0;jPrintf(“%d\t”,date[i][j]);Printf(“\n”);}}建立最小生成树并输出结果//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边voidMiniSpanTree_PRIM(MGraphG,VertexTypeu){//system("cls");inti,j,k;minsideclosedge;k=LocateVex(G,u);for(j=0;j{if(j!=k){strcpy(closedge[j].adjvex,u);closedge[j].lowcost=G.arcs[k][j].adj;}}closedge[k].lowcost=0;//初始,U={u}printf("最小代价生成树的各条边为:\n");for(i=1;i{//选择其余G.vexnum-1个顶点k=minimum(closedge,G);//求出T的下一个结点:第K顶点printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]);//输出生成树的边closedge[k].lowcost=0;//第K顶点并入U集for(j=0;jif(G.arcs[k][j].adj{//新顶点并入U集后重新选择最小边strcpy(closedge[j].adjvex,G.vexs[k]);closedge[j].lowcost=G.arcs[k][j].adj;}}system("pause");}六、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析(2)算法的时空分析和改进设想(3)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。(4)程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。主要缺点是程序的变动性比较差—初始化邻接矩阵后结果就固定了。如果能加入图行和图的修改、插入、删除等操作,我想应该会好很多七、测试结果包括输入和输出(粘贴输入输出界面,即用户屏幕) 八、带注释的源程序 实践报告4学号___1032107204_______姓名__潘俊泽_________班级_____1022________一、实验目的:熟悉数据结构,培养良好的程序设计能力二、实验内容:堆排序三、设计说明:1、利用堆的特性对记录序列进行排序,2、选一个关键字为最大的记录,3、与序列中最后一个记录交换,四、功能说明:说明本程序中的每一个函数及其功能。Print输入数据Choose选择函数Heapsort进行堆函数Createsort建堆五、调试分析内容包括:a)调试过程中遇到的问题是经常遇到自己看不懂的错误,无法解决,通过寻求同学的帮助,解决问题,提高自己的能力。b)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。六、测试结果七、带注释的源程序#include#include#definemax100000//函数声明voidPrint(intheap[]);//输入函数voidChoose(intchoice,intheap[]);//选择函数voidHeapSort(intheap[],intlength);//进行堆函数voidCreateHeap(intheap[],intlength);//创建堆函数voidsift(intheap[],intk,intm);//假设二叉树voidPrintHeap(intheap[],intlength);//输出排序后的函数//主函数intmain(){intheap[max];//定义最大值system("colora");Print(heap);//输入最大值while(true){printf("Pressentertocontinue.........");getchar();getchar();system("cls");Print(heap);}return0;}/////////////////////////////////////////////////////////////////////////////////菜单函数voidPrint(intheap[]){intchoice;printf("---------------------\n");printf("使用说明:本程序可实现堆排序算法.\n");printf("---------------------\n");printf("1.输入一个新序列并进行最大堆排序.\n");printf("2.输出当前堆的序列(顺序、逆序).\n");printf("3.按其它任意键退出.\n");printf("---------------------\n");printf("请选择你要的操作:");scanf("%d",&choice);Choose(choice,heap);}/////////////////////////////////////////////////////////////////////////////////功能函数voidChoose(intchoice,intheap[]){intn,i;switch(choice){case1:printf("请输入序列的个数:");scanf("%d",&n);printf("请依次输入将要进行堆排序排序的序列的元素:\n");for(i=1;i<=n;i++)scanf("%d",&heap[i]);heap[0]=n;HeapSort(heap,n);break;case2:printf("从小到大排序:\n");PrintHeap(heap,heap[0]);break;default:exit(0);}}/////////////////////////////////////////////////////////////////////////////////输入一个新序列并进行最大堆排序函数voidHeapSort(intheap[],intlength)//对heap[1...n]进行堆排序,执行本算法后,heap中记录按关键字由小到大有序排列{inttemp;inti,n;CreateHeap(heap,length);n=length;for(i=n;i>=2;--i){temp=heap[1];//将堆顶记录和堆中的最后一个记录互换heap[1]=heap[i];heap[i]=temp;sift(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆}}voidCreateHeap(intheap[],intlength)//对记录数组heap建堆,length为数组长度,length==heap[0]{inti;intn;n=length;for(i=n/2;i>=1;--i)sift(heap,i,n);}voidsift(intheap[],intk,intm)//假设heap[k...m]是以heap[k]为根的完全二叉树且分别以heap[2k]和heap[2k+1]为根的//左、右子树为大根堆,调整heap[k],使整个序列heap[k...m]满足堆的性质{inti,j,finished;inttemp;temp=heap[k];//暂存“根”记录heap[k]i=k;j=2*i;finished=false;while(j<=m&&!finished){if(j//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”if(temp>=heap[j])finished=true;//筛选完毕else{heap[i]=heap[j];i=j;j=2*i;}//继续筛选}heap[i]=temp;//填入到恰当位置}voidPrintHeap(intheap[],intlength){inti;for(i=1;i<=length;i++)printf("%d",heap[i]);printf("\n");注:其他题目的报告以此类推。文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
for(j=0;jdate[i][j]=INFINITY;//读入边Intfrom,to,s;Printf(“输入边,格式为i,j,k,表示i到j的权值是k:\n”);For(i=0;i{Scanf(“%d,%d,%d”,&from,&to,&s);date[from][to]=s;date[to][from]st;}//输出邻接矩阵for(i=0;i{for(j=0;jPrintf(“%d\t”,date[i][j]);Printf(“\n”);}}建立最小生成树并输出结果//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边voidMiniSpanTree_PRIM(MGraphG,VertexTypeu){//system("cls");inti,j,k;minsideclosedge;k=LocateVex(G,u);for(j=0;j{if(j!=k){strcpy(closedge[j].adjvex,u);closedge[j].lowcost=G.arcs[k][j].adj;}}closedge[k].lowcost=0;//初始,U={u}printf("最小代价生成树的各条边为:\n");for(i=1;i{//选择其余G.vexnum-1个顶点k=minimum(closedge,G);//求出T的下一个结点:第K顶点printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]);//输出生成树的边closedge[k].lowcost=0;//第K顶点并入U集for(j=0;jif(G.arcs[k][j].adj{//新顶点并入U集后重新选择最小边strcpy(closedge[j].adjvex,G.vexs[k]);closedge[j].lowcost=G.arcs[k][j].adj;}}system("pause");}六、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析(2)算法的时空分析和改进设想(3)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。(4)程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。主要缺点是程序的变动性比较差—初始化邻接矩阵后结果就固定了。如果能加入图行和图的修改、插入、删除等操作,我想应该会好很多七、测试结果包括输入和输出(粘贴输入输出界面,即用户屏幕) 八、带注释的源程序 实践报告4学号___1032107204_______姓名__潘俊泽_________班级_____1022________一、实验目的:熟悉数据结构,培养良好的程序设计能力二、实验内容:堆排序三、设计说明:1、利用堆的特性对记录序列进行排序,2、选一个关键字为最大的记录,3、与序列中最后一个记录交换,四、功能说明:说明本程序中的每一个函数及其功能。Print输入数据Choose选择函数Heapsort进行堆函数Createsort建堆五、调试分析内容包括:a)调试过程中遇到的问题是经常遇到自己看不懂的错误,无法解决,通过寻求同学的帮助,解决问题,提高自己的能力。b)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。六、测试结果七、带注释的源程序#include#include#definemax100000//函数声明voidPrint(intheap[]);//输入函数voidChoose(intchoice,intheap[]);//选择函数voidHeapSort(intheap[],intlength);//进行堆函数voidCreateHeap(intheap[],intlength);//创建堆函数voidsift(intheap[],intk,intm);//假设二叉树voidPrintHeap(intheap[],intlength);//输出排序后的函数//主函数intmain(){intheap[max];//定义最大值system("colora");Print(heap);//输入最大值while(true){printf("Pressentertocontinue.........");getchar();getchar();system("cls");Print(heap);}return0;}/////////////////////////////////////////////////////////////////////////////////菜单函数voidPrint(intheap[]){intchoice;printf("---------------------\n");printf("使用说明:本程序可实现堆排序算法.\n");printf("---------------------\n");printf("1.输入一个新序列并进行最大堆排序.\n");printf("2.输出当前堆的序列(顺序、逆序).\n");printf("3.按其它任意键退出.\n");printf("---------------------\n");printf("请选择你要的操作:");scanf("%d",&choice);Choose(choice,heap);}/////////////////////////////////////////////////////////////////////////////////功能函数voidChoose(intchoice,intheap[]){intn,i;switch(choice){case1:printf("请输入序列的个数:");scanf("%d",&n);printf("请依次输入将要进行堆排序排序的序列的元素:\n");for(i=1;i<=n;i++)scanf("%d",&heap[i]);heap[0]=n;HeapSort(heap,n);break;case2:printf("从小到大排序:\n");PrintHeap(heap,heap[0]);break;default:exit(0);}}/////////////////////////////////////////////////////////////////////////////////输入一个新序列并进行最大堆排序函数voidHeapSort(intheap[],intlength)//对heap[1...n]进行堆排序,执行本算法后,heap中记录按关键字由小到大有序排列{inttemp;inti,n;CreateHeap(heap,length);n=length;for(i=n;i>=2;--i){temp=heap[1];//将堆顶记录和堆中的最后一个记录互换heap[1]=heap[i];heap[i]=temp;sift(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆}}voidCreateHeap(intheap[],intlength)//对记录数组heap建堆,length为数组长度,length==heap[0]{inti;intn;n=length;for(i=n/2;i>=1;--i)sift(heap,i,n);}voidsift(intheap[],intk,intm)//假设heap[k...m]是以heap[k]为根的完全二叉树且分别以heap[2k]和heap[2k+1]为根的//左、右子树为大根堆,调整heap[k],使整个序列heap[k...m]满足堆的性质{inti,j,finished;inttemp;temp=heap[k];//暂存“根”记录heap[k]i=k;j=2*i;finished=false;while(j<=m&&!finished){if(j//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”if(temp>=heap[j])finished=true;//筛选完毕else{heap[i]=heap[j];i=j;j=2*i;}//继续筛选}heap[i]=temp;//填入到恰当位置}voidPrintHeap(intheap[],intlength){inti;for(i=1;i<=length;i++)printf("%d",heap[i]);printf("\n");注:其他题目的报告以此类推。文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
date[i][j]=INFINITY;
//读入边
Intfrom,to,s;
Printf(“输入边,格式为i,j,k,表示i到j的权值是k:
For(i=0;i{Scanf(“%d,%d,%d”,&from,&to,&s);date[from][to]=s;date[to][from]st;}//输出邻接矩阵for(i=0;i{for(j=0;jPrintf(“%d\t”,date[i][j]);Printf(“\n”);}}建立最小生成树并输出结果//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边voidMiniSpanTree_PRIM(MGraphG,VertexTypeu){//system("cls");inti,j,k;minsideclosedge;k=LocateVex(G,u);for(j=0;j{if(j!=k){strcpy(closedge[j].adjvex,u);closedge[j].lowcost=G.arcs[k][j].adj;}}closedge[k].lowcost=0;//初始,U={u}printf("最小代价生成树的各条边为:\n");for(i=1;i{//选择其余G.vexnum-1个顶点k=minimum(closedge,G);//求出T的下一个结点:第K顶点printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]);//输出生成树的边closedge[k].lowcost=0;//第K顶点并入U集for(j=0;jif(G.arcs[k][j].adj{//新顶点并入U集后重新选择最小边strcpy(closedge[j].adjvex,G.vexs[k]);closedge[j].lowcost=G.arcs[k][j].adj;}}system("pause");}六、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析(2)算法的时空分析和改进设想(3)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。(4)程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。主要缺点是程序的变动性比较差—初始化邻接矩阵后结果就固定了。如果能加入图行和图的修改、插入、删除等操作,我想应该会好很多七、测试结果包括输入和输出(粘贴输入输出界面,即用户屏幕) 八、带注释的源程序 实践报告4学号___1032107204_______姓名__潘俊泽_________班级_____1022________一、实验目的:熟悉数据结构,培养良好的程序设计能力二、实验内容:堆排序三、设计说明:1、利用堆的特性对记录序列进行排序,2、选一个关键字为最大的记录,3、与序列中最后一个记录交换,四、功能说明:说明本程序中的每一个函数及其功能。Print输入数据Choose选择函数Heapsort进行堆函数Createsort建堆五、调试分析内容包括:a)调试过程中遇到的问题是经常遇到自己看不懂的错误,无法解决,通过寻求同学的帮助,解决问题,提高自己的能力。b)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。六、测试结果七、带注释的源程序#include#include#definemax100000//函数声明voidPrint(intheap[]);//输入函数voidChoose(intchoice,intheap[]);//选择函数voidHeapSort(intheap[],intlength);//进行堆函数voidCreateHeap(intheap[],intlength);//创建堆函数voidsift(intheap[],intk,intm);//假设二叉树voidPrintHeap(intheap[],intlength);//输出排序后的函数//主函数intmain(){intheap[max];//定义最大值system("colora");Print(heap);//输入最大值while(true){printf("Pressentertocontinue.........");getchar();getchar();system("cls");Print(heap);}return0;}/////////////////////////////////////////////////////////////////////////////////菜单函数voidPrint(intheap[]){intchoice;printf("---------------------\n");printf("使用说明:本程序可实现堆排序算法.\n");printf("---------------------\n");printf("1.输入一个新序列并进行最大堆排序.\n");printf("2.输出当前堆的序列(顺序、逆序).\n");printf("3.按其它任意键退出.\n");printf("---------------------\n");printf("请选择你要的操作:");scanf("%d",&choice);Choose(choice,heap);}/////////////////////////////////////////////////////////////////////////////////功能函数voidChoose(intchoice,intheap[]){intn,i;switch(choice){case1:printf("请输入序列的个数:");scanf("%d",&n);printf("请依次输入将要进行堆排序排序的序列的元素:\n");for(i=1;i<=n;i++)scanf("%d",&heap[i]);heap[0]=n;HeapSort(heap,n);break;case2:printf("从小到大排序:\n");PrintHeap(heap,heap[0]);break;default:exit(0);}}/////////////////////////////////////////////////////////////////////////////////输入一个新序列并进行最大堆排序函数voidHeapSort(intheap[],intlength)//对heap[1...n]进行堆排序,执行本算法后,heap中记录按关键字由小到大有序排列{inttemp;inti,n;CreateHeap(heap,length);n=length;for(i=n;i>=2;--i){temp=heap[1];//将堆顶记录和堆中的最后一个记录互换heap[1]=heap[i];heap[i]=temp;sift(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆}}voidCreateHeap(intheap[],intlength)//对记录数组heap建堆,length为数组长度,length==heap[0]{inti;intn;n=length;for(i=n/2;i>=1;--i)sift(heap,i,n);}voidsift(intheap[],intk,intm)//假设heap[k...m]是以heap[k]为根的完全二叉树且分别以heap[2k]和heap[2k+1]为根的//左、右子树为大根堆,调整heap[k],使整个序列heap[k...m]满足堆的性质{inti,j,finished;inttemp;temp=heap[k];//暂存“根”记录heap[k]i=k;j=2*i;finished=false;while(j<=m&&!finished){if(j//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”if(temp>=heap[j])finished=true;//筛选完毕else{heap[i]=heap[j];i=j;j=2*i;}//继续筛选}heap[i]=temp;//填入到恰当位置}voidPrintHeap(intheap[],intlength){inti;for(i=1;i<=length;i++)printf("%d",heap[i]);printf("\n");注:其他题目的报告以此类推。文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
{
Scanf(“%d,%d,%d”,&from,&to,&s);
date[from][to]=s;
date[to][from]st;
}
//输出邻接矩阵
for(i=0;i{for(j=0;jPrintf(“%d\t”,date[i][j]);Printf(“\n”);}}建立最小生成树并输出结果//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边voidMiniSpanTree_PRIM(MGraphG,VertexTypeu){//system("cls");inti,j,k;minsideclosedge;k=LocateVex(G,u);for(j=0;j{if(j!=k){strcpy(closedge[j].adjvex,u);closedge[j].lowcost=G.arcs[k][j].adj;}}closedge[k].lowcost=0;//初始,U={u}printf("最小代价生成树的各条边为:\n");for(i=1;i{//选择其余G.vexnum-1个顶点k=minimum(closedge,G);//求出T的下一个结点:第K顶点printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]);//输出生成树的边closedge[k].lowcost=0;//第K顶点并入U集for(j=0;jif(G.arcs[k][j].adj{//新顶点并入U集后重新选择最小边strcpy(closedge[j].adjvex,G.vexs[k]);closedge[j].lowcost=G.arcs[k][j].adj;}}system("pause");}六、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析(2)算法的时空分析和改进设想(3)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。(4)程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。主要缺点是程序的变动性比较差—初始化邻接矩阵后结果就固定了。如果能加入图行和图的修改、插入、删除等操作,我想应该会好很多七、测试结果包括输入和输出(粘贴输入输出界面,即用户屏幕) 八、带注释的源程序 实践报告4学号___1032107204_______姓名__潘俊泽_________班级_____1022________一、实验目的:熟悉数据结构,培养良好的程序设计能力二、实验内容:堆排序三、设计说明:1、利用堆的特性对记录序列进行排序,2、选一个关键字为最大的记录,3、与序列中最后一个记录交换,四、功能说明:说明本程序中的每一个函数及其功能。Print输入数据Choose选择函数Heapsort进行堆函数Createsort建堆五、调试分析内容包括:a)调试过程中遇到的问题是经常遇到自己看不懂的错误,无法解决,通过寻求同学的帮助,解决问题,提高自己的能力。b)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。六、测试结果七、带注释的源程序#include#include#definemax100000//函数声明voidPrint(intheap[]);//输入函数voidChoose(intchoice,intheap[]);//选择函数voidHeapSort(intheap[],intlength);//进行堆函数voidCreateHeap(intheap[],intlength);//创建堆函数voidsift(intheap[],intk,intm);//假设二叉树voidPrintHeap(intheap[],intlength);//输出排序后的函数//主函数intmain(){intheap[max];//定义最大值system("colora");Print(heap);//输入最大值while(true){printf("Pressentertocontinue.........");getchar();getchar();system("cls");Print(heap);}return0;}/////////////////////////////////////////////////////////////////////////////////菜单函数voidPrint(intheap[]){intchoice;printf("---------------------\n");printf("使用说明:本程序可实现堆排序算法.\n");printf("---------------------\n");printf("1.输入一个新序列并进行最大堆排序.\n");printf("2.输出当前堆的序列(顺序、逆序).\n");printf("3.按其它任意键退出.\n");printf("---------------------\n");printf("请选择你要的操作:");scanf("%d",&choice);Choose(choice,heap);}/////////////////////////////////////////////////////////////////////////////////功能函数voidChoose(intchoice,intheap[]){intn,i;switch(choice){case1:printf("请输入序列的个数:");scanf("%d",&n);printf("请依次输入将要进行堆排序排序的序列的元素:\n");for(i=1;i<=n;i++)scanf("%d",&heap[i]);heap[0]=n;HeapSort(heap,n);break;case2:printf("从小到大排序:\n");PrintHeap(heap,heap[0]);break;default:exit(0);}}/////////////////////////////////////////////////////////////////////////////////输入一个新序列并进行最大堆排序函数voidHeapSort(intheap[],intlength)//对heap[1...n]进行堆排序,执行本算法后,heap中记录按关键字由小到大有序排列{inttemp;inti,n;CreateHeap(heap,length);n=length;for(i=n;i>=2;--i){temp=heap[1];//将堆顶记录和堆中的最后一个记录互换heap[1]=heap[i];heap[i]=temp;sift(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆}}voidCreateHeap(intheap[],intlength)//对记录数组heap建堆,length为数组长度,length==heap[0]{inti;intn;n=length;for(i=n/2;i>=1;--i)sift(heap,i,n);}voidsift(intheap[],intk,intm)//假设heap[k...m]是以heap[k]为根的完全二叉树且分别以heap[2k]和heap[2k+1]为根的//左、右子树为大根堆,调整heap[k],使整个序列heap[k...m]满足堆的性质{inti,j,finished;inttemp;temp=heap[k];//暂存“根”记录heap[k]i=k;j=2*i;finished=false;while(j<=m&&!finished){if(j//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”if(temp>=heap[j])finished=true;//筛选完毕else{heap[i]=heap[j];i=j;j=2*i;}//继续筛选}heap[i]=temp;//填入到恰当位置}voidPrintHeap(intheap[],intlength){inti;for(i=1;i<=length;i++)printf("%d",heap[i]);printf("\n");注:其他题目的报告以此类推。文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
for(j=0;jPrintf(“%d\t”,date[i][j]);Printf(“\n”);}}建立最小生成树并输出结果//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边voidMiniSpanTree_PRIM(MGraphG,VertexTypeu){//system("cls");inti,j,k;minsideclosedge;k=LocateVex(G,u);for(j=0;j{if(j!=k){strcpy(closedge[j].adjvex,u);closedge[j].lowcost=G.arcs[k][j].adj;}}closedge[k].lowcost=0;//初始,U={u}printf("最小代价生成树的各条边为:\n");for(i=1;i{//选择其余G.vexnum-1个顶点k=minimum(closedge,G);//求出T的下一个结点:第K顶点printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]);//输出生成树的边closedge[k].lowcost=0;//第K顶点并入U集for(j=0;jif(G.arcs[k][j].adj{//新顶点并入U集后重新选择最小边strcpy(closedge[j].adjvex,G.vexs[k]);closedge[j].lowcost=G.arcs[k][j].adj;}}system("pause");}六、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析(2)算法的时空分析和改进设想(3)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。(4)程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。主要缺点是程序的变动性比较差—初始化邻接矩阵后结果就固定了。如果能加入图行和图的修改、插入、删除等操作,我想应该会好很多七、测试结果包括输入和输出(粘贴输入输出界面,即用户屏幕) 八、带注释的源程序 实践报告4学号___1032107204_______姓名__潘俊泽_________班级_____1022________一、实验目的:熟悉数据结构,培养良好的程序设计能力二、实验内容:堆排序三、设计说明:1、利用堆的特性对记录序列进行排序,2、选一个关键字为最大的记录,3、与序列中最后一个记录交换,四、功能说明:说明本程序中的每一个函数及其功能。Print输入数据Choose选择函数Heapsort进行堆函数Createsort建堆五、调试分析内容包括:a)调试过程中遇到的问题是经常遇到自己看不懂的错误,无法解决,通过寻求同学的帮助,解决问题,提高自己的能力。b)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。六、测试结果七、带注释的源程序#include#include#definemax100000//函数声明voidPrint(intheap[]);//输入函数voidChoose(intchoice,intheap[]);//选择函数voidHeapSort(intheap[],intlength);//进行堆函数voidCreateHeap(intheap[],intlength);//创建堆函数voidsift(intheap[],intk,intm);//假设二叉树voidPrintHeap(intheap[],intlength);//输出排序后的函数//主函数intmain(){intheap[max];//定义最大值system("colora");Print(heap);//输入最大值while(true){printf("Pressentertocontinue.........");getchar();getchar();system("cls");Print(heap);}return0;}/////////////////////////////////////////////////////////////////////////////////菜单函数voidPrint(intheap[]){intchoice;printf("---------------------\n");printf("使用说明:本程序可实现堆排序算法.\n");printf("---------------------\n");printf("1.输入一个新序列并进行最大堆排序.\n");printf("2.输出当前堆的序列(顺序、逆序).\n");printf("3.按其它任意键退出.\n");printf("---------------------\n");printf("请选择你要的操作:");scanf("%d",&choice);Choose(choice,heap);}/////////////////////////////////////////////////////////////////////////////////功能函数voidChoose(intchoice,intheap[]){intn,i;switch(choice){case1:printf("请输入序列的个数:");scanf("%d",&n);printf("请依次输入将要进行堆排序排序的序列的元素:\n");for(i=1;i<=n;i++)scanf("%d",&heap[i]);heap[0]=n;HeapSort(heap,n);break;case2:printf("从小到大排序:\n");PrintHeap(heap,heap[0]);break;default:exit(0);}}/////////////////////////////////////////////////////////////////////////////////输入一个新序列并进行最大堆排序函数voidHeapSort(intheap[],intlength)//对heap[1...n]进行堆排序,执行本算法后,heap中记录按关键字由小到大有序排列{inttemp;inti,n;CreateHeap(heap,length);n=length;for(i=n;i>=2;--i){temp=heap[1];//将堆顶记录和堆中的最后一个记录互换heap[1]=heap[i];heap[i]=temp;sift(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆}}voidCreateHeap(intheap[],intlength)//对记录数组heap建堆,length为数组长度,length==heap[0]{inti;intn;n=length;for(i=n/2;i>=1;--i)sift(heap,i,n);}voidsift(intheap[],intk,intm)//假设heap[k...m]是以heap[k]为根的完全二叉树且分别以heap[2k]和heap[2k+1]为根的//左、右子树为大根堆,调整heap[k],使整个序列heap[k...m]满足堆的性质{inti,j,finished;inttemp;temp=heap[k];//暂存“根”记录heap[k]i=k;j=2*i;finished=false;while(j<=m&&!finished){if(j//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”if(temp>=heap[j])finished=true;//筛选完毕else{heap[i]=heap[j];i=j;j=2*i;}//继续筛选}heap[i]=temp;//填入到恰当位置}voidPrintHeap(intheap[],intlength){inti;for(i=1;i<=length;i++)printf("%d",heap[i]);printf("\n");注:其他题目的报告以此类推。文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
Printf(“%d\t”,date[i][j]);
Printf(“\n”);
建立最小生成树并输出结果
//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边
voidMiniSpanTree_PRIM(MGraphG,VertexTypeu)
{//system("cls");
inti,j,k;
minsideclosedge;
k=LocateVex(G,u);
for(j=0;j{if(j!=k){strcpy(closedge[j].adjvex,u);closedge[j].lowcost=G.arcs[k][j].adj;}}closedge[k].lowcost=0;//初始,U={u}printf("最小代价生成树的各条边为:\n");for(i=1;i{//选择其余G.vexnum-1个顶点k=minimum(closedge,G);//求出T的下一个结点:第K顶点printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]);//输出生成树的边closedge[k].lowcost=0;//第K顶点并入U集for(j=0;jif(G.arcs[k][j].adj{//新顶点并入U集后重新选择最小边strcpy(closedge[j].adjvex,G.vexs[k]);closedge[j].lowcost=G.arcs[k][j].adj;}}system("pause");}六、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析(2)算法的时空分析和改进设想(3)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。(4)程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。主要缺点是程序的变动性比较差—初始化邻接矩阵后结果就固定了。如果能加入图行和图的修改、插入、删除等操作,我想应该会好很多七、测试结果包括输入和输出(粘贴输入输出界面,即用户屏幕) 八、带注释的源程序 实践报告4学号___1032107204_______姓名__潘俊泽_________班级_____1022________一、实验目的:熟悉数据结构,培养良好的程序设计能力二、实验内容:堆排序三、设计说明:1、利用堆的特性对记录序列进行排序,2、选一个关键字为最大的记录,3、与序列中最后一个记录交换,四、功能说明:说明本程序中的每一个函数及其功能。Print输入数据Choose选择函数Heapsort进行堆函数Createsort建堆五、调试分析内容包括:a)调试过程中遇到的问题是经常遇到自己看不懂的错误,无法解决,通过寻求同学的帮助,解决问题,提高自己的能力。b)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。六、测试结果七、带注释的源程序#include#include#definemax100000//函数声明voidPrint(intheap[]);//输入函数voidChoose(intchoice,intheap[]);//选择函数voidHeapSort(intheap[],intlength);//进行堆函数voidCreateHeap(intheap[],intlength);//创建堆函数voidsift(intheap[],intk,intm);//假设二叉树voidPrintHeap(intheap[],intlength);//输出排序后的函数//主函数intmain(){intheap[max];//定义最大值system("colora");Print(heap);//输入最大值while(true){printf("Pressentertocontinue.........");getchar();getchar();system("cls");Print(heap);}return0;}/////////////////////////////////////////////////////////////////////////////////菜单函数voidPrint(intheap[]){intchoice;printf("---------------------\n");printf("使用说明:本程序可实现堆排序算法.\n");printf("---------------------\n");printf("1.输入一个新序列并进行最大堆排序.\n");printf("2.输出当前堆的序列(顺序、逆序).\n");printf("3.按其它任意键退出.\n");printf("---------------------\n");printf("请选择你要的操作:");scanf("%d",&choice);Choose(choice,heap);}/////////////////////////////////////////////////////////////////////////////////功能函数voidChoose(intchoice,intheap[]){intn,i;switch(choice){case1:printf("请输入序列的个数:");scanf("%d",&n);printf("请依次输入将要进行堆排序排序的序列的元素:\n");for(i=1;i<=n;i++)scanf("%d",&heap[i]);heap[0]=n;HeapSort(heap,n);break;case2:printf("从小到大排序:\n");PrintHeap(heap,heap[0]);break;default:exit(0);}}/////////////////////////////////////////////////////////////////////////////////输入一个新序列并进行最大堆排序函数voidHeapSort(intheap[],intlength)//对heap[1...n]进行堆排序,执行本算法后,heap中记录按关键字由小到大有序排列{inttemp;inti,n;CreateHeap(heap,length);n=length;for(i=n;i>=2;--i){temp=heap[1];//将堆顶记录和堆中的最后一个记录互换heap[1]=heap[i];heap[i]=temp;sift(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆}}voidCreateHeap(intheap[],intlength)//对记录数组heap建堆,length为数组长度,length==heap[0]{inti;intn;n=length;for(i=n/2;i>=1;--i)sift(heap,i,n);}voidsift(intheap[],intk,intm)//假设heap[k...m]是以heap[k]为根的完全二叉树且分别以heap[2k]和heap[2k+1]为根的//左、右子树为大根堆,调整heap[k],使整个序列heap[k...m]满足堆的性质{inti,j,finished;inttemp;temp=heap[k];//暂存“根”记录heap[k]i=k;j=2*i;finished=false;while(j<=m&&!finished){if(j//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”if(temp>=heap[j])finished=true;//筛选完毕else{heap[i]=heap[j];i=j;j=2*i;}//继续筛选}heap[i]=temp;//填入到恰当位置}voidPrintHeap(intheap[],intlength){inti;for(i=1;i<=length;i++)printf("%d",heap[i]);printf("\n");注:其他题目的报告以此类推。文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
if(j!
=k)
strcpy(closedge[j].adjvex,u);
closedge[j].lowcost=G.arcs[k][j].adj;
closedge[k].lowcost=0;//初始,U={u}
printf("最小代价生成树的各条边为:
\n");
for(i=1;i{//选择其余G.vexnum-1个顶点k=minimum(closedge,G);//求出T的下一个结点:第K顶点printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]);//输出生成树的边closedge[k].lowcost=0;//第K顶点并入U集for(j=0;jif(G.arcs[k][j].adj{//新顶点并入U集后重新选择最小边strcpy(closedge[j].adjvex,G.vexs[k]);closedge[j].lowcost=G.arcs[k][j].adj;}}system("pause");}六、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析(2)算法的时空分析和改进设想(3)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。(4)程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。主要缺点是程序的变动性比较差—初始化邻接矩阵后结果就固定了。如果能加入图行和图的修改、插入、删除等操作,我想应该会好很多七、测试结果包括输入和输出(粘贴输入输出界面,即用户屏幕) 八、带注释的源程序 实践报告4学号___1032107204_______姓名__潘俊泽_________班级_____1022________一、实验目的:熟悉数据结构,培养良好的程序设计能力二、实验内容:堆排序三、设计说明:1、利用堆的特性对记录序列进行排序,2、选一个关键字为最大的记录,3、与序列中最后一个记录交换,四、功能说明:说明本程序中的每一个函数及其功能。Print输入数据Choose选择函数Heapsort进行堆函数Createsort建堆五、调试分析内容包括:a)调试过程中遇到的问题是经常遇到自己看不懂的错误,无法解决,通过寻求同学的帮助,解决问题,提高自己的能力。b)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。六、测试结果七、带注释的源程序#include#include#definemax100000//函数声明voidPrint(intheap[]);//输入函数voidChoose(intchoice,intheap[]);//选择函数voidHeapSort(intheap[],intlength);//进行堆函数voidCreateHeap(intheap[],intlength);//创建堆函数voidsift(intheap[],intk,intm);//假设二叉树voidPrintHeap(intheap[],intlength);//输出排序后的函数//主函数intmain(){intheap[max];//定义最大值system("colora");Print(heap);//输入最大值while(true){printf("Pressentertocontinue.........");getchar();getchar();system("cls");Print(heap);}return0;}/////////////////////////////////////////////////////////////////////////////////菜单函数voidPrint(intheap[]){intchoice;printf("---------------------\n");printf("使用说明:本程序可实现堆排序算法.\n");printf("---------------------\n");printf("1.输入一个新序列并进行最大堆排序.\n");printf("2.输出当前堆的序列(顺序、逆序).\n");printf("3.按其它任意键退出.\n");printf("---------------------\n");printf("请选择你要的操作:");scanf("%d",&choice);Choose(choice,heap);}/////////////////////////////////////////////////////////////////////////////////功能函数voidChoose(intchoice,intheap[]){intn,i;switch(choice){case1:printf("请输入序列的个数:");scanf("%d",&n);printf("请依次输入将要进行堆排序排序的序列的元素:\n");for(i=1;i<=n;i++)scanf("%d",&heap[i]);heap[0]=n;HeapSort(heap,n);break;case2:printf("从小到大排序:\n");PrintHeap(heap,heap[0]);break;default:exit(0);}}/////////////////////////////////////////////////////////////////////////////////输入一个新序列并进行最大堆排序函数voidHeapSort(intheap[],intlength)//对heap[1...n]进行堆排序,执行本算法后,heap中记录按关键字由小到大有序排列{inttemp;inti,n;CreateHeap(heap,length);n=length;for(i=n;i>=2;--i){temp=heap[1];//将堆顶记录和堆中的最后一个记录互换heap[1]=heap[i];heap[i]=temp;sift(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆}}voidCreateHeap(intheap[],intlength)//对记录数组heap建堆,length为数组长度,length==heap[0]{inti;intn;n=length;for(i=n/2;i>=1;--i)sift(heap,i,n);}voidsift(intheap[],intk,intm)//假设heap[k...m]是以heap[k]为根的完全二叉树且分别以heap[2k]和heap[2k+1]为根的//左、右子树为大根堆,调整heap[k],使整个序列heap[k...m]满足堆的性质{inti,j,finished;inttemp;temp=heap[k];//暂存“根”记录heap[k]i=k;j=2*i;finished=false;while(j<=m&&!finished){if(j//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”if(temp>=heap[j])finished=true;//筛选完毕else{heap[i]=heap[j];i=j;j=2*i;}//继续筛选}heap[i]=temp;//填入到恰当位置}voidPrintHeap(intheap[],intlength){inti;for(i=1;i<=length;i++)printf("%d",heap[i]);printf("\n");注:其他题目的报告以此类推。文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
{//选择其余G.vexnum-1个顶点
k=minimum(closedge,G);//求出T的下一个结点:
第K顶点
printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]);//输出生成树的边
closedge[k].lowcost=0;//第K顶点并入U集
for(j=0;jif(G.arcs[k][j].adj{//新顶点并入U集后重新选择最小边strcpy(closedge[j].adjvex,G.vexs[k]);closedge[j].lowcost=G.arcs[k][j].adj;}}system("pause");}六、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析(2)算法的时空分析和改进设想(3)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。(4)程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。主要缺点是程序的变动性比较差—初始化邻接矩阵后结果就固定了。如果能加入图行和图的修改、插入、删除等操作,我想应该会好很多七、测试结果包括输入和输出(粘贴输入输出界面,即用户屏幕) 八、带注释的源程序 实践报告4学号___1032107204_______姓名__潘俊泽_________班级_____1022________一、实验目的:熟悉数据结构,培养良好的程序设计能力二、实验内容:堆排序三、设计说明:1、利用堆的特性对记录序列进行排序,2、选一个关键字为最大的记录,3、与序列中最后一个记录交换,四、功能说明:说明本程序中的每一个函数及其功能。Print输入数据Choose选择函数Heapsort进行堆函数Createsort建堆五、调试分析内容包括:a)调试过程中遇到的问题是经常遇到自己看不懂的错误,无法解决,通过寻求同学的帮助,解决问题,提高自己的能力。b)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。六、测试结果七、带注释的源程序#include#include#definemax100000//函数声明voidPrint(intheap[]);//输入函数voidChoose(intchoice,intheap[]);//选择函数voidHeapSort(intheap[],intlength);//进行堆函数voidCreateHeap(intheap[],intlength);//创建堆函数voidsift(intheap[],intk,intm);//假设二叉树voidPrintHeap(intheap[],intlength);//输出排序后的函数//主函数intmain(){intheap[max];//定义最大值system("colora");Print(heap);//输入最大值while(true){printf("Pressentertocontinue.........");getchar();getchar();system("cls");Print(heap);}return0;}/////////////////////////////////////////////////////////////////////////////////菜单函数voidPrint(intheap[]){intchoice;printf("---------------------\n");printf("使用说明:本程序可实现堆排序算法.\n");printf("---------------------\n");printf("1.输入一个新序列并进行最大堆排序.\n");printf("2.输出当前堆的序列(顺序、逆序).\n");printf("3.按其它任意键退出.\n");printf("---------------------\n");printf("请选择你要的操作:");scanf("%d",&choice);Choose(choice,heap);}/////////////////////////////////////////////////////////////////////////////////功能函数voidChoose(intchoice,intheap[]){intn,i;switch(choice){case1:printf("请输入序列的个数:");scanf("%d",&n);printf("请依次输入将要进行堆排序排序的序列的元素:\n");for(i=1;i<=n;i++)scanf("%d",&heap[i]);heap[0]=n;HeapSort(heap,n);break;case2:printf("从小到大排序:\n");PrintHeap(heap,heap[0]);break;default:exit(0);}}/////////////////////////////////////////////////////////////////////////////////输入一个新序列并进行最大堆排序函数voidHeapSort(intheap[],intlength)//对heap[1...n]进行堆排序,执行本算法后,heap中记录按关键字由小到大有序排列{inttemp;inti,n;CreateHeap(heap,length);n=length;for(i=n;i>=2;--i){temp=heap[1];//将堆顶记录和堆中的最后一个记录互换heap[1]=heap[i];heap[i]=temp;sift(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆}}voidCreateHeap(intheap[],intlength)//对记录数组heap建堆,length为数组长度,length==heap[0]{inti;intn;n=length;for(i=n/2;i>=1;--i)sift(heap,i,n);}voidsift(intheap[],intk,intm)//假设heap[k...m]是以heap[k]为根的完全二叉树且分别以heap[2k]和heap[2k+1]为根的//左、右子树为大根堆,调整heap[k],使整个序列heap[k...m]满足堆的性质{inti,j,finished;inttemp;temp=heap[k];//暂存“根”记录heap[k]i=k;j=2*i;finished=false;while(j<=m&&!finished){if(j//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”if(temp>=heap[j])finished=true;//筛选完毕else{heap[i]=heap[j];i=j;j=2*i;}//继续筛选}heap[i]=temp;//填入到恰当位置}voidPrintHeap(intheap[],intlength){inti;for(i=1;i<=length;i++)printf("%d",heap[i]);printf("\n");注:其他题目的报告以此类推。文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
if(G.arcs[k][j].adj{//新顶点并入U集后重新选择最小边strcpy(closedge[j].adjvex,G.vexs[k]);closedge[j].lowcost=G.arcs[k][j].adj;}}system("pause");}六、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析(2)算法的时空分析和改进设想(3)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。(4)程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。主要缺点是程序的变动性比较差—初始化邻接矩阵后结果就固定了。如果能加入图行和图的修改、插入、删除等操作,我想应该会好很多七、测试结果包括输入和输出(粘贴输入输出界面,即用户屏幕) 八、带注释的源程序 实践报告4学号___1032107204_______姓名__潘俊泽_________班级_____1022________一、实验目的:熟悉数据结构,培养良好的程序设计能力二、实验内容:堆排序三、设计说明:1、利用堆的特性对记录序列进行排序,2、选一个关键字为最大的记录,3、与序列中最后一个记录交换,四、功能说明:说明本程序中的每一个函数及其功能。Print输入数据Choose选择函数Heapsort进行堆函数Createsort建堆五、调试分析内容包括:a)调试过程中遇到的问题是经常遇到自己看不懂的错误,无法解决,通过寻求同学的帮助,解决问题,提高自己的能力。b)经验与体会等通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。六、测试结果七、带注释的源程序#include#include#definemax100000//函数声明voidPrint(intheap[]);//输入函数voidChoose(intchoice,intheap[]);//选择函数voidHeapSort(intheap[],intlength);//进行堆函数voidCreateHeap(intheap[],intlength);//创建堆函数voidsift(intheap[],intk,intm);//假设二叉树voidPrintHeap(intheap[],intlength);//输出排序后的函数//主函数intmain(){intheap[max];//定义最大值system("colora");Print(heap);//输入最大值while(true){printf("Pressentertocontinue.........");getchar();getchar();system("cls");Print(heap);}return0;}/////////////////////////////////////////////////////////////////////////////////菜单函数voidPrint(intheap[]){intchoice;printf("---------------------\n");printf("使用说明:本程序可实现堆排序算法.\n");printf("---------------------\n");printf("1.输入一个新序列并进行最大堆排序.\n");printf("2.输出当前堆的序列(顺序、逆序).\n");printf("3.按其它任意键退出.\n");printf("---------------------\n");printf("请选择你要的操作:");scanf("%d",&choice);Choose(choice,heap);}/////////////////////////////////////////////////////////////////////////////////功能函数voidChoose(intchoice,intheap[]){intn,i;switch(choice){case1:printf("请输入序列的个数:");scanf("%d",&n);printf("请依次输入将要进行堆排序排序的序列的元素:\n");for(i=1;i<=n;i++)scanf("%d",&heap[i]);heap[0]=n;HeapSort(heap,n);break;case2:printf("从小到大排序:\n");PrintHeap(heap,heap[0]);break;default:exit(0);}}/////////////////////////////////////////////////////////////////////////////////输入一个新序列并进行最大堆排序函数voidHeapSort(intheap[],intlength)//对heap[1...n]进行堆排序,执行本算法后,heap中记录按关键字由小到大有序排列{inttemp;inti,n;CreateHeap(heap,length);n=length;for(i=n;i>=2;--i){temp=heap[1];//将堆顶记录和堆中的最后一个记录互换heap[1]=heap[i];heap[i]=temp;sift(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆}}voidCreateHeap(intheap[],intlength)//对记录数组heap建堆,length为数组长度,length==heap[0]{inti;intn;n=length;for(i=n/2;i>=1;--i)sift(heap,i,n);}voidsift(intheap[],intk,intm)//假设heap[k...m]是以heap[k]为根的完全二叉树且分别以heap[2k]和heap[2k+1]为根的//左、右子树为大根堆,调整heap[k],使整个序列heap[k...m]满足堆的性质{inti,j,finished;inttemp;temp=heap[k];//暂存“根”记录heap[k]i=k;j=2*i;finished=false;while(j<=m&&!finished){if(j//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”if(temp>=heap[j])finished=true;//筛选完毕else{heap[i]=heap[j];i=j;j=2*i;}//继续筛选}heap[i]=temp;//填入到恰当位置}voidPrintHeap(intheap[],intlength){inti;for(i=1;i<=length;i++)printf("%d",heap[i]);printf("\n");注:其他题目的报告以此类推。文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
//新顶点并入U集后重新选择最小边
strcpy(closedge[j].adjvex,G.vexs[k]);
system("pause");
六、调试分析
内容包括:
(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析
(2)算法的时空分析和改进设想
(3)经验与体会等
通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。
同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。
(4)程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。
该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。
主要缺点是程序的变动性比较差—初始化邻接矩阵后结果就固定了。
如果能加入图行和图的修改、插入、删除等操作,我想应该会好很多
七、测试结果
包括输入和输出(粘贴输入输出界面,即用户屏幕)
八、带注释的源程序
实践报告4
学号___1032107204_______姓名__潘俊泽_________班级_____1022________
堆排序
1、利用堆的特性对记录序列进行排序,
2、选一个关键字为最大的记录,
3、与序列中最后一个记录交换,
四、功能说明:
Print输入数据
Choose选择函数
Heapsort进行堆函数
Createsort建堆
五、调试分析
a)调试过程中遇到的问题是经常遇到自己看不懂的错误,无法解决,通过寻求同学的帮助,解决问题,提高自己的能力。
b)经验与体会等
六、测试结果
七、带注释的源程序
#include
#definemax100000
//函数声明
voidPrint(intheap[]);//输入函数
voidChoose(intchoice,intheap[]);//选择函数
voidHeapSort(intheap[],intlength);//进行堆函数
voidCreateHeap(intheap[],intlength);//创建堆函数
voidsift(intheap[],intk,intm);//假设二叉树
voidPrintHeap(intheap[],intlength);//输出排序后的函数
//主函数
intmain()
intheap[max];//定义最大值
system("colora");
Print(heap);//输入最大值
while(true)
printf("Pressentertocontinue.........");
getchar();
system("cls");
Print(heap);
return0;
///////////////////////////////////////////////////////////////////////////////
//菜单函数
voidPrint(intheap[])
intchoice;
printf("---------------------\n");
printf("使用说明:
本程序可实现堆排序算法.\n");
printf("1.输入一个新序列并进行最大堆排序.\n");
printf("2.输出当前堆的序列(顺序、逆序).\n");
printf("3.按其它任意键退出.\n");
printf("请选择你要的操作:
");
scanf("%d",&choice);
Choose(choice,heap);
//功能函数
voidChoose(intchoice,intheap[])
intn,i;
switch(choice)
case1:
printf("请输入序列的个数:
scanf("%d",&n);
printf("请依次输入将要进行堆排序排序的序列的元素:
for(i=1;i<=n;i++)
scanf("%d",&heap[i]);
heap[0]=n;
HeapSort(heap,n);
break;
case2:
printf("从小到大排序:
PrintHeap(heap,heap[0]);
default:
exit(0);
//输入一个新序列并进行最大堆排序函数
voidHeapSort(intheap[],intlength)
//对heap[1...n]进行堆排序,执行本算法后,heap中记录按关键字由小到大有序排列
inttemp;
inti,n;
CreateHeap(heap,length);
n=length;
for(i=n;i>=2;--i)
temp=heap[1];//将堆顶记录和堆中的最后一个记录互换
heap[1]=heap[i];
heap[i]=temp;
sift(heap,1,i-1);//进行调整,使heap[1...i-1]变成堆
voidCreateHeap(intheap[],intlength)
//对记录数组heap建堆,length为数组长度,length==heap[0]
inti;
intn;
for(i=n/2;i>=1;--i)
sift(heap,i,n);
voidsift(intheap[],intk,intm)
//假设heap[k...m]是以heap[k]为根的完全二叉树且分别以heap[2k]和heap[2k+1]为根的
//左、右子树为大根堆,调整heap[k],使整个序列heap[k...m]满足堆的性质
inti,j,finished;
temp=heap[k];//暂存“根”记录heap[k]
i=k;
j=2*i;
finished=false;
while(j<=m&&!
finished)
if(j//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”if(temp>=heap[j])finished=true;//筛选完毕else{heap[i]=heap[j];i=j;j=2*i;}//继续筛选}heap[i]=temp;//填入到恰当位置}voidPrintHeap(intheap[],intlength){inti;for(i=1;i<=length;i++)printf("%d",heap[i]);printf("\n");注:其他题目的报告以此类推。文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
//若存在右子树,且右子树根的关键字大,则沿右分支“筛选”
if(temp>=heap[j])finished=true;//筛选完毕
else
heap[i]=heap[j];
i=j;
}//继续筛选
heap[i]=temp;//填入到恰当位置
voidPrintHeap(intheap[],intlength)
for(i=1;i<=length;i++)
printf("%d",heap[i]);
printf("\n");
注:
其他题目的报告以此类推。
文件命名采用学号姓名.doc形式,学号放前姓名放后,例如0720107116张琛.doc
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1