数据结构实验——分类二叉树和堆排序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档