细节待补充
#include<stdio.h>
#define MAXDATA 100000
typedef struct node* MaxHeap;
struct node{
int *data;
int size;
int capacity;
};
MaxHeap creat(int maxsize)
{
MaxHeap h=(MaxHeap)ma lloc(struct node);
h->data=(int*)malloc((maxsize+1)*sizeof(int));
h->size=0;
h->capacity=maxsize+1;
h->data[0]=MAXDATA;
return h;
}
bool isfull(MaxHeap H)
{
if(!H) return false;
else return true;
}
bool insert(MaxHeap H,int x)
{
int i=H->size+1;
if(isfull(H)) return false;
else
{
for(;x>H->data[i/2];i/=2)
{
H->data[i]=H->data[i/2];
}
H->data[i]=x;
return true;
}
}
int delete(MaxHeap H)
{
int parent,child;
int maxitem,x;//maxitem存放根的值,x存放最后一个结点的值,待用
maxitem=H->data[1];
x=H->data[H->size];
H->size--;
for(parent=1;parent*2<=H->size;parent=child)
{
child=parent*2;
if((child!=H->size)&&H->data[child]<H->data[child+1]) child++; //找到左右儿子中的大儿子
if(x>=data[child]) break;
else H->data[parent]=H->data[child];
}
H->data[parent]=x;
return maxitem;
}
int delete(MinHeap H)
{
int minitem,temp;
int parent,child;
minitem=H->data[1];
temp=H->data[H->size];
H->size--;
for(parent=1;parent*2<=H->size;parent=child)
{
child=parent*2;
if((child!=H->size)&&(H->data[child]>H->data[child+1])) child++;
if(temp<=H->data[child]) break;
else
{
H->data[parent]=H->data[child];
}
}
H->data[parent]=temp;
return minitem;
}
typedef struct node1 *Huffman;
struct node1{
int weight;
Huffman left,right;
};
typedef struct node2 *MinHeap;
struct node2{
int *data;
int size;
int capacity;
};
Huffman huffmanCreat(MinHeap H)
{
int i;
Huffman T;
BuildMinHeap(H);
for(i=1;i<H->size;i++)
{
T=malloc(sizeof(struct node1));
T->left=deletemin(H);
T->right=deletemin(H);
T->weight=T->left->weight+T->right->weight;
insert(H,T);
}
T=deletemin(H);
return H;
}
MinHeap CreatMinHeap(int maxsize)
{
MinHeap H=malloc(sizeof(struct node2));
H->data=(int*)malloc(maxsize*sizeof(int));
H->capacity=maxsize;
H->size=0;
H->data[0]=MINDATA;
//如果要添加数据了的话...
int i,n;
printf("please input n");
scanf("%d",&n);//n个数据
if(n>maxsize) return error;
else
{
for(i=1;i<=n;i++)
{
scanf("%d",&H->data[i]);
}
}
}
void BulidMinHeap(MinHeap H)
{
int i=H->size;
for(i=i/2;i>0;i--)
{
PercDown(H,i);
}
}
void PercDown(MinHeap H,int i)
{
int parent,child;
int x;
x=H->data[i];
for(parent=1;2*parent<=H->size;parent=child)
{
child=parent*2;
if(child!=H->size&&H->data[child]>H->data[child+1]) child++;
if(x<H->=data[child]) break;
else
{
H->data[parent]=H->data[child];
}
H->data[parent]=x;
}
}