数据结构:堆,哈夫曼树

细节待补充

#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;
	}
}

发布了46 篇原创文章 · 获赞 13 · 访问量 3685

猜你喜欢

转载自blog.csdn.net/qq_39679772/article/details/103950881