最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

哈夫曼樹、哈夫曼編碼

2023-01-12 15:42 作者:就叫大嘴吧  | 我要投稿


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define Max 100
 
typedef struct HTNode{
	int weight;
	int parent, rchild, lchild;
}HTNode, *HuffmanTree;

// 指向指針類型的 指針 
typedef char* *HuffmanCode;

void Select(HuffmanTree HT, int n, int &s1, int &s2){
	int min;
	//找第一個最小值
	for(int i = 1; i <= n; i++){
		if (HT[i].parent == 0){
			min = i;
			break;
		}
	}
	for(int i = min + 1; i <= n; i++){
		if(HT[i].parent == 0 && HT[i].weight < HT[min].weight){
			min = i;
		}	
	}
	s1 = min; //第一個最小值給s1
	
	//找第二個最小值
	for(int i = 1; i <= n; i++){
		if(HT[i].parent == 0 && i != s1){
			min = i;
			break;
		}
	}
	for (int i = min + 1; i <= n; i++){
		if(HT[i].parent == 0 && HT[i].weight < HT[min].weight && i != s1){
			min = i;
		}	
	}
	s2 = min; //第二個最小值給s2
}

void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int w[], int n){
	int i;

	if(n <= 1){
		return;
	}
	// n 個葉子結(jié)點的哈夫曼樹共 2*n - 1 個結(jié)點 
	int m = 2*n - 1; 
	// 多分配一個空間,0 號單元未使用 
	HT = (HTNode*) malloc((m + 1)*sizeof(HTNode));
	
	// HuffTree數(shù)組初始化為 0.
	for(i = 1; i <= n; i++){
		HT[i].weight = w[i];
		HT[i].parent = 0;
		HT[i].lchild = 0;
		HT[i].rchild = 0; 
	} 

	// 構建哈夫曼樹.
	for(i = n + 1; i <= m; i++){
	 ? ?int s1, s2;
	 ? ?// 在 HT[1 ~ i-1]選擇 parent 為 0 且 weight 最小的兩個結(jié)點,其序號分別為 s1 和 s2。 
		Select(HT, i - 1, s1, s2);
		HT[i].weight = HT[s1].weight + HT[s2].weight;
		HT[s1].parent = i;
		HT[s2].parent = i;
		HT[i].lchild = s1; 
		HT[i].rchild = s2;
	} 
	
	// 從 葉子到根逆向 求每個字符的哈夫曼編碼 
	
	// 分配 n 個字符編碼的頭指針向量 
	HC = (HuffmanCode) malloc( (n + 1) * sizeof(char*) );
	// 分配求編碼的工作空間 
	char* temp = (char*) malloc( n * sizeof(char) );
	// 編碼結(jié)束符 
	temp[n - 1] = '\0';
	// 每一個字符求哈夫曼編碼 
	int start, pos, parent;
	for(i = 1; i <= n; i++){
		start = n - 1;
		pos = i;
		parent = HT[i].parent;
		
		while(parent != 0){
			if(HT[parent].lchild == pos){
				// 左子樹:置 0 
				temp[--start] = '0';
			}
			else{
				// 右子樹:置 1 
				temp[--start] = '1';
			}
			pos = parent;
			parent = HT[parent].parent;
		}
		// 為每一個字符編碼分配空間,分配的空間大小不同 
		HC[i] = (char*) malloc( (n - start) * sizeof(char) );
		// 從 temp 復制編碼到 HC 
		strcpy(HC[i], &temp[start]);
	}
	// 釋放工作空間 
	free(temp);
}

// 輸出哈夫曼樹、哈夫曼編碼 
void printfHTAndHC(HuffmanTree HT, HuffmanCode HC, int n){
	for(int i = 1; i <= 2*n - 1; i++){
		printf("i = %d, weight = %d, parent = %d, lchild = %d, rchild = %d\n",
		 i, HT[i].weight, HT[i].parent, HT[i].lchild, HT[i].rchild);
	}
	
	for(int i = 1; i <= n; i++){
		printf("%d 的 哈夫曼編碼為:%s\n",HT[i].weight, HC[i]);
	}
}

int main() {
	
	int n;
	int w[Max];
	HuffmanTree HT;
	HuffmanCode HC; 
	 
	printf("請輸入葉子結(jié)點個數(shù):");
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		printf("請輸入第 %d 個葉子結(jié)點的權值:", i);
		scanf("%d", &w[i]);
	}
	
	HuffmanCoding(HT, HC, w, n);
	
	printfHTAndHC(HT, HC, n);
	
	return 0;
}


哈夫曼樹、哈夫曼編碼的評論 (共 條)

分享到微博請遵守國家法律
九龙坡区| 红桥区| 大港区| 祥云县| 灵武市| 比如县| 阳山县| 横山县| 子长县| 临沧市| 滨州市| 循化| 夹江县| 武功县| 祁连县| 双牌县| 乐亭县| 左贡县| 柞水县| 顺义区| 盱眙县| 长寿区| 乌审旗| 北辰区| 新闻| 石景山区| 五常市| 潜江市| 沐川县| 三穗县| 张北县| 宁津县| 凤山县| 仁怀市| 日土县| 武夷山市| 阿克陶县| 含山县| 益阳市| 南皮县| 格尔木市|