#include<stdio.h> #include<stdlib.h>
typedef struct { int weight; int lchild; int rchild; int parent;
}Node,*HuffmanTree;
typedef char* HuffmanCode;
int main() {
}
void select(HuffmanTree* huffmanTree, int n, int* s1, int* s2) { int min; for (int i = 1; i <= n; i++) { if ((*huffmanTree)[i].parent == 0) { min = i; break; } } for (int i = 1; i <= n; i++) { if ((*huffmanTree)[i].parent == 0) { if ((*huffmanTree)[i].weight < (*huffmanTree)[min].weight) { min = i; } } }
*s1 = min;
for (int i = 1; i <= n; i++) { if ((*huffmanTree)[i].parent == 0 && i != *s1) { min = i; break; } } for (int i = 1; i <= n; i++) { if ((*huffmanTree)[i].parent == 0 && i != *s1) { if ((*huffmanTree)[i].weight < (*huffmanTree)[min].weight) { min = i; } } }
*s2 = min;
}
void creatHuffmanTree(HuffmanTree* huffmanTree, int w[], int n) { int s1, s2; int m = 2 * n - 1; *huffmanTree = (HuffmanTree)malloc((m + 1) * sizeof(Node)); for (int i = 1; i <= n; i++) { (*huffmanTree)[i].weight = w[i]; (*huffmanTree)[i].lchild = 0; (*huffmanTree)[i].rchild = 0; (*huffmanTree)[i].parent = 0; } for (int i = n + 1; i < m; i++) { (*huffmanTree)[i].weight = 0; (*huffmanTree)[i].lchild = 0; (*huffmanTree)[i].rchild = 0; (*huffmanTree)[i].parent = 0; } for (int i = n + 1; i <= m; i++) { select(huffmanTree, i - 1, &s1, &s2);
(*huffmanTree)[s1].parent = i; (*huffmanTree)[s2].parent = i; (*huffmanTree)[i].lchild = s1; (*huffmanTree)[i].lchild = s2; (*huffmanTree)[i].weight = (*huffmanTree)[s1].weight + (*huffmanTree)[s2].weight; } }
void creatHuffmanCode(HuffmanTree* huffmanTree, HuffmanCode* huffmanCode, int n) { int c; int p; int start; huffmanCode = (HuffmanCode*)malloc((n + 1) * sizeof(char*)); char* cd = (char*)malloc(n * sizeof(char)); cd[n - 1] = '\0';
for (int i = 1; i <= n; i++) { start = n - 1; for (c = i, p = (*huffmanTree)[i].parent; p != 0; c = p, p = (*huffmanTree)[p].parent) { if ((*huffmanTree)[p].lchild == c) { cd[--start] = '0'; } else { cd[--start] = '1'; } }
huffmanCode[i] = (char*)malloc((n - start) * sizeof(char)); strcpy(huffmanCode[i], &cd[start]); }
for (int i = 1; i <= n; i++) { printf("%s\n", huffmanCode[i]); } }
|