学号姓名C语言程序设计实训课程设计报告.docx
《学号姓名C语言程序设计实训课程设计报告.docx》由会员分享,可在线阅读,更多相关《学号姓名C语言程序设计实训课程设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
学号姓名C语言程序设计实训课程设计报告
齐鲁工业大学信息学院
《数据结构》课程设计报告
题目:
图书管理系统
专业班级:
计科(外包)15-2
学号:
201503091063
姓名:
杨朔蓬
时间:
2016.5.30
一、
需求分析
1.本演示程序中,堆中元素为整数,堆的大小无限制,堆的输入方式与整型数组输入相同,本程序主要是利用堆排序原理进行设计,实现对输入数据的排序和最大元的输出。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;相应的输入数据和运算结果显示在其后。
3.程序执行命令包括:
1)新建大根堆
2)输出最大元素
3)插入元素至大根堆
4)输出大根堆数组
5)输出大根堆(按行)
6)销毁堆
二、概要设计
1.抽象数据类型定义
ADTHeapSort{
数据对象:
D={ai|ai属于Elemset,i=1,2,3........,n,n=>0};
数据关系:
R1={ai=>a2i;ai=>a2i+1};
基本操作:
Init_Sq(&L)
操作结果:
新建一个堆
InitSq(&L)
初始条件:
堆已存在
操作结果:
将输入整数插入到大根堆中
HeapAdjust(SqList&L,ints)
初始条件:
堆已存在
操作结果:
把s调到堆中合适位置
HeapSort(&L)
初始条件:
堆已存在
操作结果:
无序数列调整为一个大顶堆
DelMax(&L)
初始条件:
堆已存在
操作结果:
取出最大元素
DeleteHeap(&L)
操作结果:
销毁堆
PutList(L)
初始条件:
堆已存在
操作结果:
按行输出堆中元素
Load_sq(L)
初始条件:
堆已存在
操作结果:
输出堆数组
}ADTHeapSort
三、详细设计
#include
#include
typedefstruct{
int*key;
intlength;
}SqList;
voidLoad_sq(SqListL){//打印堆数组
inti;
if(L.length){
printf("堆数组为\n:
");
for(i=1;i<=L.length;i++)
printf("%d",L.key[i]);
printf("\n");
}
elseprintf("堆为空!
!
\n");
system("pause");
system("cls");
}
voidPutList(SqListL){//按行打印堆
inth=0,sum=0,item=1;
inti,j,cnt=1,tmp=1;
if(L.length){
while(sumsum+=item;
h++;
item*=2;
}
printf("\n------------------------\n");
printf("堆中元素:
\n");
for(i=0;iprintf("第%d行元素",i+1);
for(j=0;jprintf("%d",L.key[cnt++]);
printf("\n");
tmp*=2;
}
printf("\n");
}
elseprintf("堆为空!
!
\n");
system("pause");
system("cls");
}
voidHeapAdjust(SqList*L,ints){//调整堆
intj;
L->key[0]=L->key[s];
for(j=2*s;j<=L->length;j*=2){
if((jlength)&&(L->key[j]key[j+1]))
j++;
if(L->key[0]>=L->key[j])
break;
L->key[s]=L->key[j];
s=j;
}
L->key[s]=L->key[0];
}
voidHeapSort(SqList*L){//建立大顶堆
inti;
for(i=L->length/2;i>0;i--)
HeapAdjust(L,i);
}
intInit_Sq(SqList*L){//新建堆
inti;
printf("请输入初始堆的长度:
");
scanf("%d",&L->length);
L->key=(int*)malloc((L->length+1)*sizeof(int));
if(!
L->key)exit
(1);
printf("请输入初始堆的各个元素\n:
");
for(i=1;i<=L->length;i++)
scanf("%d",&L->key[i]);
HeapSort(L);
printf("新建堆成功!
\n");
system("pause");
system("cls");
return1;
}
voidInitSq(SqList*L){//插入元素
inta,i,*newkey;
intlen=L->length+1;
printf("请输入插入元素个数:
");
scanf("%d",&a);
L->length+=a;
newkey=(int*)realloc(L->key,(L->length+1)*sizeof(int));
if(!
newkey)exit
(2);
L->key=newkey;
printf("请输入初始堆的各个元素\n:
");
for(i=len;i<=L->length;i++)
scanf("%d",&L->key[i]);
HeapSort(L);
printf("插入元素成功!
\n");
system("pause");
system("cls");
}
voidDelMax(SqList*L){//删除最大元
if(L->length){
printf("最大元素为:
%d\n",L->key[1]);
L->key[1]=L->key[L->length];
L->length--;
HeapAdjust(L,1);
}
elseprintf("堆为空!
!
\n");
system("pause");
system("cls");
}
intDeleteHeap(SqList*L){
if(L->length){
free(L->key);
L->length=0;
L=NULL;
printf("销毁完成!
\n");
system("pause");
system("cls");
return1;
}
else{
printf("已为空,无需销毁!
\n");
system("pause");
system("cls");
return0;
}
}
voidmenu(){
printf("*****************************\n");
printf("#1、新建大根堆#\n");
printf("#2、输出最大元素#\n");
printf("#3、插入元素至大根堆#\n");
printf("#4、输出大根堆数组#\n");
printf("#5、输出大根堆(按行)#\n");
printf("#6、销毁堆#\n");
printf("#7、退出#\n");
printf("*****************************\n");
printf("请选择\n:
");
}
voidmenu_2(){
printf("**********************************\n");
printf("*1、从堆中删除后输出*\n");
printf("*2、直接输出*\n");
printf("**********************************\n");
printf("请选择\n:
");
}
intmain()
{
inti,j;
SqListL;
L.length=0;
while
(1){
menu();
scanf("%d",&i);
switch(i){
case1:
Init_Sq(&L);
break;
case2:
menu_2();
scanf("%d",&j);
if(j==1)DelMax(&L);
elseif(j==2){
if(L.length)
printf("最大元素为:
%d\n",L.key[1]);
else
printf("堆为空!
!
\n");
system("pause");
system("cls");
}
break;
case3:
InitSq(&L);
break;
case4:
Load_sq(L);
break;
case5:
PutList(L);
break;
case6:
DeleteHeap(&L);
break;
case7:
return0;
default:
printf("无此项!
!
!
\n");
system("pause");
system("cls");
}
}
}
函数调用关系:
Main
Menumenu_2Init_SqInitSqDelMaxLoad_sqPutListDeleteHeap
HeapSortHeapAdjust
SqList
四、调试分析
在编程过程中遇到很多问题,比如函数之间参数的传递,刚开始总搞不清楚应该传递什么样的参数,还有在设计堆的筛选中,总是搞不清楚应该怎样筛选,后来经过查阅资料解决了这些问题,程序顺利执行。
执行过程中发现了一些bug,比如在堆为空时执行输出程序会崩溃,这些bug已经顺利解决了。
五、用户手册
1.本程序运行环境为dos操作系统,执行文件为Heap.exe。
2.进入演示程序即显示文本方式的用户界面:
3.选择相应的选项即可进行操作。
六、测试结果
执行命令1:
执行命令2:
执行命令3:
执行命令4:
执行命令5:
执行命令6:
执行命令7:
退出
七、附录
源程序文件名
Heap.c//主程序
八、总结与心得
在本次程序设计中,运用了堆排序的基本原理,在编程的过程中,首先要了解大顶堆的定义,以及如何利用堆排序的原理进行排序,合理的设计筛选模块,先从主函数开始,正确使用特殊语句,以及关键字,在这过程要用到for、while、switch循环语句,最重要的就是要写出正确的判断语句,搞清楚程序的结束的点以及函数的递归调用,在大顶堆的筛选的时候,要明白堆排序的实质,就是从最后一个非叶子节点开始,从它的左右子树开始比较,顺着子树较大的方向往父节点平移,最后和序列的最后一个数据进行交换,把它放置在闲置的空间内。
在编程的完成之后,要进行仔细的检验,找出错误,进行多次验证,确保此程序准确无误,并且要使程序简单明了,便于操作者使用方便。
在进行了此次程序设计之后,明白了如何利用堆排序原理进行对数据的排序,对以前所学的知识进行了巩固,增加了实践的经验。