⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffman.c

📁 数据结构源码合集
💻 C
字号:
#include <stdio.h>#include <stdlib.h>typedef struct node *link;struct node{	int f;	link l, r;};int N;link *h;link NODE(int f, link l, link r){	link t = malloc(sizeof *t);	t->f = f;	t->l = l;	t->r = r;	return t;}void get_freq(void){	int i, f;	scanf("%d", &N);	h = malloc(N * sizeof(link));	for(i = 0; i < N; i++)	{		scanf("%d", &f);		h[i] = NODE(f, NULL, NULL);	}	h--;}void swap(int i, int j){	struct node tmp_node;	tmp_node = *h[i];	*h[i] = *h[j];	*h[j] = tmp_node;}int less(int i, int j){	return (h[i]->f < h[j]->f);}void sift_down(int k, int n){	int j;	while((2 * k) <= n)	{		j = 2 * k;		if(((j + 1) < n) && less(j + 1, j))			j++;		if(!less(j, k))			break;		swap(k, j);		k = j;	}}void sift_up(int k){	int j;	while(k > 1)	{		j = k / 2;		if(less(k, j))			swap(k, j);		k = j;	}}void pq_init(void){	int i;	for(i = N / 2; i >= 1; i--)		sift_down(i, N);}link get_min(void){	swap(1, N);	sift_down(1, --N);	return h[N + 1];}void insert(link t){	h[++N] = t;	sift_up(N);}void pre_order(link t){	if(t)	{		printf("(");		printf("%d", t->f);		pre_order(t->l);		pre_order(t->r);		printf(")");	}	else		printf("()");}int main(void){	get_freq();	pq_init();	while(N > 1)	{		link t1 = get_min();		link t2 = get_min();		insert(NODE((t1->f + t2->f), t1, t2));	}	printf("\\tree ");	pre_order(h[1]);	puts("");	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -