// BinaryHeapAdd.c
// 备注: 本程序显示结果应以二叉树形式而非数组形式排列
// FLAG = 0 最小堆
// FLAG = 1 最大堆
#define FLAG 0
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
typedef int DataType;
typedef unsigned char NumType; // 有效个数:2至255
// 堆元素数量上限
// ( 2 ^ ( sizeof ( NumType ) * 8 ) ) - 1
#define LIMIT ( NumType ) ( ( 1 << ( sizeof ( NumType ) << 3 ) ) - 1 )
typedef enum { false, true } bool;
typedef struct
{
DataType data[LIMIT]; // 堆元素
NumType CurrentSize; // 当前堆元素数量
// 此处可添加堆的其它信息
} BinaryHeap;
bool BinaryHeapAdd(BinaryHeap * const, const DataType);
int main(void)
{
BinaryHeap element;
DataType NewElement;
NumType i;
srand((unsigned int)time(0));
element.CurrentSize = LIMIT - 1;
for (i = 0; i < element.CurrentSize; ++i)
{
#if !FLAG // FLAG == 0
// rand() % 100 随机生成0至99共计100种随机数字
element.data[i] = rand() % 100;
if (i) // i非根
// 结点data[i]的父结点是data[(i - 1) / 2]
// 故儿子生成随机数再加上父亲的值 如此即可保证生成最小堆随机数
// element.data[i] = element.data[i] + element.data[(i - 1) / 2];
element.data[i] += element.data[(i - 1) >> 1];
#elif FLAG // FLAG == 1
if (i) // i != 0 i非根
// 结点data[i]的父结点是data[(i - 1) / 2]
// 故儿子生成随机数等于父亲的值减去随机值 如此即可保证生成最大堆随机数
// element.data[i] = element.data[(i - 1) / 2] - (rand() % 100);
element.data[i] = element.data[(i - 1) >> 1] - (rand() % 100);
else // i == 0 i为根
element.data[i] = 32767 - rand() % 100;
#endif
}
#if !FLAG // FLAG == 0
NewElement = rand() % 1000;
#elif FLAG // FLAG == 1
NewElement = 32767 - rand() % 1000;
#endif
printf("新元素: %d\n\n", NewElement);
puts("生成随机数:\n");
for (i = 0; i < element.CurrentSize; ++i)
{
printf("%-5d\t", element.data[i]);
if (i % 10 == 9)
putchar('\n');
}
#if !FLAG // FLAG == 0
puts("\n\n最小堆添加元素后:\n");
#elif FLAG // FLAG == 1
puts("\n\n最大堆添加元素后:\n");
#endif
if (BinaryHeapAdd(&element, NewElement))
for (i = 0; i < element.CurrentSize; ++i)
{
printf("%-5d\t", element.data[i]);
if (i % 10 == 9)
putchar('\n');
}
else
puts("堆元素数量超上限!");
putchar('\n');
getch();
return 0;
}
/******************************以上代码仅供测试******************************/
// 最小/大堆添加元素
bool BinaryHeapAdd(BinaryHeap * const heap, const DataType NewElement)
{
NumType hole = heap->CurrentSize, index;
if (heap->CurrentSize < LIMIT)
{
#if !FLAG // FLAG == 0
// for (; hole > 0 && NewElement < heap->data[index = (hole - 1) / 2]; hole = index)
for (; hole && NewElement < heap->data[index = ((hole - 1) >> 1)]; hole = index)
#elif FLAG // FLAG == 1
// for (; hole > 0 && NewElement > heap->data[index = (hole - 1) / 2]; hole = index)
for (; hole && NewElement > heap->data[index = ((hole - 1) >> 1)]; hole = index)
#endif
heap->data[hole] = heap->data[index];
heap->data[hole] = NewElement;
++heap->CurrentSize;
return true;
}
else // heap->CurrentSize >= MAXHEAP
return false;
}