学号姓名C语言程序设计实训课程设计报告.docx

上传人:b****2 文档编号:2464557 上传时间:2022-10-29 格式:DOCX 页数:11 大小:52.33KB
下载 相关 举报
学号姓名C语言程序设计实训课程设计报告.docx_第1页
第1页 / 共11页
学号姓名C语言程序设计实训课程设计报告.docx_第2页
第2页 / 共11页
学号姓名C语言程序设计实训课程设计报告.docx_第3页
第3页 / 共11页
学号姓名C语言程序设计实训课程设计报告.docx_第4页
第4页 / 共11页
学号姓名C语言程序设计实训课程设计报告.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

学号姓名C语言程序设计实训课程设计报告.docx

《学号姓名C语言程序设计实训课程设计报告.docx》由会员分享,可在线阅读,更多相关《学号姓名C语言程序设计实训课程设计报告.docx(11页珍藏版)》请在冰豆网上搜索。

学号姓名C语言程序设计实训课程设计报告.docx

学号姓名C语言程序设计实训课程设计报告

 

齐鲁工业大学信息学院

《数据结构》课程设计报告

 

题目:

图书管理系统

专业班级:

计科(外包)15-2

学号:

1063

姓名:

杨朔蓬

时间:

一、需求分析

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(sum

sum+=item;

h++;

item*=2;

}

printf("\n------------------------\n");

printf("堆中元素:

\n");

for(i=0;i

printf("第%d行元素",i+1);

for(j=0;j

printf("%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循环语句,最重要的就是要写出正确的判断语句,搞清楚程序的结

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1