数据结构C排序上机实验报告完整版.docx

上传人:b****0 文档编号:9252543 上传时间:2023-05-17 格式:DOCX 页数:13 大小:35.05KB
下载 相关 举报
数据结构C排序上机实验报告完整版.docx_第1页
第1页 / 共13页
数据结构C排序上机实验报告完整版.docx_第2页
第2页 / 共13页
数据结构C排序上机实验报告完整版.docx_第3页
第3页 / 共13页
数据结构C排序上机实验报告完整版.docx_第4页
第4页 / 共13页
数据结构C排序上机实验报告完整版.docx_第5页
第5页 / 共13页
数据结构C排序上机实验报告完整版.docx_第6页
第6页 / 共13页
数据结构C排序上机实验报告完整版.docx_第7页
第7页 / 共13页
数据结构C排序上机实验报告完整版.docx_第8页
第8页 / 共13页
数据结构C排序上机实验报告完整版.docx_第9页
第9页 / 共13页
数据结构C排序上机实验报告完整版.docx_第10页
第10页 / 共13页
数据结构C排序上机实验报告完整版.docx_第11页
第11页 / 共13页
数据结构C排序上机实验报告完整版.docx_第12页
第12页 / 共13页
数据结构C排序上机实验报告完整版.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据结构C排序上机实验报告完整版.docx

《数据结构C排序上机实验报告完整版.docx》由会员分享,可在线阅读,更多相关《数据结构C排序上机实验报告完整版.docx(13页珍藏版)》请在冰点文库上搜索。

数据结构C排序上机实验报告完整版.docx

数据结构C排序上机实验报告完整版

电子科技大学资源与环境学院

 

标准实验报告

 

(实验)课程名称数据结构

 

电子科技大学教务处制表

电子科技大学

实验报告

学生姓名:

高建波学号:

2019070402020指导教师:

钱江

实验地点:

品学楼A504实验时间:

2020年11月30日

一、实验室名称:

基础实验大楼504

二、实验项目名称:

排序

三、实验学时:

2

四、实验原理:

使用C语言编写程序实现二叉排序平衡树,并进行冒泡排序和快速排序。

五、实验目的:

1、掌握平衡二叉树的调整方法,掌握冒泡排序和快速排序

六、实验内容:

假设待排序元素存放在一维数组中,

1)给定一个无序序列,构造平均查找长度尽可能小的二叉排序树,并输出元素值。

2)实现快速排序与冒泡法排序算法。

七、实验器材(设备、元器件):

微型计算机

八、实验步骤:

实验程序见附录。

九、实验数据及结果分析:

十、实验结论:

运用c语言可以实现二叉排序平衡树的构建。

报告评分:

指导教师签字:

附录(代码)

#include

#include

#defineERROR-1

#defineTRUE1

#defineFALSE-1

#defineMAXSIZE20

//二叉排序树平衡因子定义//

#defineLH+1

#defineEH0

#defineRH-1

 

//定义平衡二叉树的结点结构

typedefstructBiTNode

{

intdata;

intbf;//平衡因子

BiTNode*lchild,*rchild;

}BiTNode,*BiTree;

typedefstruct{

intdata[MAXSIZE];

intlength;

}SqList;

intPart_QuickSort(SqList&L,intlow,inthigh){

intpivotkey=L.data[low];

L.data[0]=L.data[low];

while((low

{

while(low=pivotkey)--high;

L.data[low]=L.data[high];

while(low

L.data[high]=L.data[low];

}

L.data[low]=L.data[0];

returnlow;

}

SqListQuick_Sort(SqList&L2,intlow,inthigh){

intpivotloc;

inti;

if(low

pivotloc=Part_QuickSort(L2,low,high);

Quick_Sort(L2,low,pivotloc-1);

Quick_Sort(L2,pivotloc+1,high);

}//endif

returnL2;

}

voidBubble_Sort(SqListL)

{

inti,j,temp;

for(i=1;i<=L.length;i++)

{

for(j=1;j<=L.length-1;j++)

{

if(L.data[j]>L.data[j+1])

{

temp=L.data[j+1];

L.data[j+1]=L.data[j];

L.data[j]=temp;

}

}

}

for(i=1;i<=L.length;i++){

printf("%d\t",L.data[i]);

}

putchar('\n');

}

 

//右旋处理,即LL调整

voidR_Rotate(BiTree*p)

{

BiTreeL;

L=(*p)->lchild;

(*p)->lchild=L->rchild;

L->rchild=*p;

*p=L;

}

//左旋处理,即RR调整

voidL_Rotate(BiTree*p)

{

BiTreeR;

R=(*p)->rchild;

(*p)->rchild=R->lchild;

R->lchild=*p;

*p=R;

}

//左平衡旋转处理,包括LL和LR调整

voidLeftBalance(BiTree*T)

{

BiTreeL,Lr;

L=(*T)->lchild;

switch(L->bf)

{

case1:

//新结点插入在T的左孩子的左子树上,为LL型,作右旋处理即LL调整

(*T)->bf=L->bf=0;

R_Rotate(T);

break;

case-1:

//新结点插入在T的左孩子的右子树上,为LR型,作双旋处理

Lr=L->rchild;

switch(Lr->bf)

{

case1:

(*T)->bf=-1;

L->bf=0;

break;

case0:

(*T)->bf=L->bf=0;

break;

case-1:

(*T)->bf=0;

L->bf=1;

break;

}

Lr->bf=0;

L_Rotate(&(*T)->lchild);//先对T的左子树进行左旋处理即RR调整

R_Rotate(T);//再对T进行右旋处理即LL调整

}

}

//右平衡旋转处理,包括RR和RL调整

voidRightBalance(BiTree*T)

{

BiTreeR,Rl;

R=(*T)->rchild;

switch(R->bf)

{

case-1:

//新结点插入在T的右孩子的右子树上,为RR型,作左旋处理即RR调整

(*T)->bf=R->bf=0;

L_Rotate(T);

break;

case1:

//新结点插入在T的右孩子的左子树上,为RL型,作双旋处理

Rl=R->lchild;

switch(Rl->bf)

{

case1:

(*T)->bf=0;

R->bf=-1;

break;

case0:

(*T)->bf=R->bf=0;

break;

case-1:

(*T)->bf=1;

R->bf=0;

break;

}

Rl->bf=0;

R_Rotate(&(*T)->rchild);//先对T的左子树进行左旋即RR调整

L_Rotate(T);//再对T进行右旋即LL调整

}

}

//若在平衡二叉树T中不存在和e具有相同数据的结点,则插入数据元素为e的新结点,

//若因插入使二叉排序树失去平衡,则要作平衡调整,

//布尔变量taller表示T的深度是否增加,TRUE表示增加,FALSE表示没有增加

intInsertAVL(BiTree*T,inte,int*taller)

{

if(!

*T)

{

*T=(BiTree)malloc(sizeof(BiTNode));

(*T)->data=e;

(*T)->lchild=(*T)->rchild=NULL;

(*T)->bf=0;

*taller=TRUE;

}

else

{

//树中已有和e具有相同数据的结点,则不再插入

if(e==(*T)->data)

{

*taller=FALSE;

returnFALSE;

}

if(e<(*T)->data)//继续在T的左子树进行搜索

{

if(!

InsertAVL(&(*T)->lchild,e,taller))//InsertAVL(&(*T)->lchild,e,taller)得到的是T的左孩子结点(*T)->lchild的data,bf等相关信息

{

returnFALSE;

}

//如果e已插入到T的左子树中,且左子树深度增加

if(*taller)

{

switch((*T)->bf)//检查T的平衡因子

{

case1:

//原本左子树比右子树高,再加上此结点,导致不平衡,需要作LL或LR调整

LeftBalance(T);

*taller=FALSE;

break;

case0:

//原本左右子树等高,再加上此结点,左子树增高

(*T)->bf=1;

*taller=TRUE;

break;

case-1:

//原本右子树比左子树高,再加上此结点,左右子树变为等高

(*T)->bf=0;

*taller=FALSE;

break;

}

}

}

else//在T的右子树进行搜索

{

if(!

InsertAVL(&(*T)->rchild,e,taller))

{

returnFALSE;

}

if(*taller)

{

switch((*T)->bf)

{

case1:

//原先左子树比右子树高,现在左右子树等高

(*T)->bf=0;

*taller=FALSE;

break;

case0:

//原先左右子树等高,现在右子树增高

(*T)->bf=-1;

*taller=TRUE;

break;

case-1:

//原先右子树比左子树高,现在再加上此结点,导致不平衡,需要作RR或RL调整

RightBalance(T);

*taller=FALSE;

break;

}

}

}

}

returnTRUE;

}

BiTreeCreateAVL(SqListL)

{

inti;

BiTreeT=NULL;

inttaller;

for(i=1;i

{

InsertAVL(&T,L.data[i],&taller);

}

returnT;

}

intInOrderTraverse(BiTreeT)//中序遍历算法//

{

if(T==NULL)return0;

else

{

InOrderTraverse(T->lchild);//递归遍历左子树//

printf("%d\t",T->data);//访问根节点//

InOrderTraverse(T->rchild);//递归遍历右子树//

}

}

 

voidmain(){

inti;

SqListL;

L.length=0;

BiTreeT;

for(i=1;i

scanf_s("%d",&L.data[i]);

if(getchar()=='#')break;

L.length++;

}

 

T=CreateAVL(L);//建立二叉排序平衡树//

InOrderTraverse(T);

putchar('\n');

Bubble_Sort(L);

Quick_Sort(L,1,L.length);

for(i=1;i<=L.length;i++){

printf("%d\t",L.data[i]);

}

putchar('\n');

}

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2