数据结构实验——分类二叉树和堆排序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构《实验3》实验报告
附源程序
#include
#include
#define MaxSize 10
typedef struct
{
int Num;
float score1;
float score2;
float score3;
}Student;//储存学生信息,依次为学号,语文成绩,数学成绩,英语成绩typedef struct
{
float total;//学生总分
Student * p;
}HeapNode;
//
typedef struct BinaryTreeNode
{
HeapNode data;
BinaryTreeNode * LChild;
BinaryTreeNode * RChild;
}BinaryTreeNode;
//分类二叉树的结点
int HeapSize=9;
void Displayarray(HeapNode a[])//输出堆排序的结果
{
int i;
for(i=1;i<10;i++)
printf(" 学号%d 总分%f\n",a[i].p->Num,a[i].total);
printf("\n");
}
void Menu_name()
//作者信息
{
printf("\n\n\n\n\n\n\n");
printf("
*************************************************\n");
printf(" 堆排序和分类二叉树的查找\n\n");
printf(" 制作: \n 学号0909050108\n");
printf(" 班级: \n");
printf(" 指导老师: \n");
printf("
**************************************************\n");
printf("\n\n\n\t\t");
}
void MaxHeapInit (HeapNode a[], int size)
{// 对数组a 中的数据初始化为一个最大堆
HeapNode *heap=a; //数组a用Heap指向
HeapSize=size; //数组中数据元素个数存放到HeapSize for (int i = HeapSize/2; i >= 1; i--) //从最后一个结点的根开始,直到第一个结点
{
heap[0] = heap[i]; // 将子树根结点值复制到工作空间heap[0]中
int son = 2*i; // son的双亲结点是heap[0]的目标位
置,
// son首先指向i的左孩子
while (son <= HeapSize)
{// 找左右孩子中较大结点
if (son < HeapSize && heap[son].total < heap[son +1].total)
son ++;
// son < HeapSize时,存在右孩子,如左孩子小于右孩子,son指向右孩子
if (heap[0].total>= heap[son].total) // 大孩子再与工作空间中结点值再比较
break; //工作空间中值大,找到heap[0]的目标位置
heap[son /2] = heap[son]; // 将大孩子上移至双亲位置
son*= 2; // son下移一层到上移的结点(大孩子)位置
}
heap[son /2] = heap[0]; //heap[0]存放到目标位置}
}
//最大堆中删除顶结点,并放入x中返回算法
bool MaxHeapDelete (HeapNode a[], HeapNode &x)
{
HeapNode *heap = a;
if (HeapSize == 0)
return false; // 堆空
x = heap[1]; // 最大结点存放到x
heap[0] = heap[HeapSize--]; // 最后一个结点存放到heap[0],调整堆中元素的个数
int i = 1, son = 2*i;
while (son <= HeapSize)
{
if (son < HeapSize && heap[son] .total< heap[son+1].total)
son++;
if (heap[0].total >= heap[son].total)
break;
heap[i] = heap[son]; // 孩子上移
i = son; // 下移根结点指针,继续比较
son = son * 2;
}
heap[i] = heap[0];
return true;
}
void HeapSort(HeapNode a[], int n)
{// 利用堆对a[1:n] 数组中的数据排序
HeapNode *heap=a;
MaxHeapInit(heap, n); // Heap初始化为最大堆
HeapNode x;
int m=1;
for (int i = n-1; i >= 1; i--)
{
MaxHeapDelete (heap,x);
printf(" 第%d堆排序结果\n",m);
m++;
Displayarray(a);
system("pause");
system("cls");
heap[i+1] = x;
}
}
BinaryTreeNode *SortBinaryTreeInsert (BinaryTreeNode *&BT, HeapNode &x) {//求如果不重复出现,则插入结点x
BinaryTreeNode *p;
BinaryTreeNode *parent = NULL; //指向p的双亲
p=BT;
while (p)
{
parent = p;
if (x.total < p->data.total)
p=p->LChild;
else
if (x.total > p->data.total)
p = p->RChild;
else
return p; //重复出现,即相等值结点出现
}
// 找到插入点,为x申请一个空间填入其值,并将该结点连接至parent BinaryTreeNode *q = new BinaryTreeNode;
q ->data = x;
q->LChild=NULL;
q->RChild=NULL;