#include <stdio.h>
#include "windows.h"
typedef char E;
struct Tree{
E element;
struct Tree * right;
struct Tree * left;
int value;
};
typedef struct Tree * tree;
typedef tree T;
struct LNode {
T element;
struct LNode *Next;
};
typedef struct LNode *Node;
struct Queue {
Node front, rear;
};
typedef struct Queue *LQueue;
BOOL initQueue(LQueue queue) {
queue->front = queue->rear = malloc(sizeof(struct LNode));
if (queue->front == NULL) return 0;
return 1;
}
BOOL pushQueue(LQueue queue, T element) {
Node NewNode = malloc(sizeof(struct LNode));
if (NewNode == NULL) return 0;
NewNode->element = element;
NewNode->Next = NULL;
Node pre = queue->front;
while (pre->Next && pre->Next->element->value <= element->value)
pre = pre->Next;
if (pre == queue->rear) {
queue->rear->Next = NewNode;
queue->rear = NewNode;
} else {
NewNode->Next = pre->Next;
pre->Next = NewNode;
}
return 1;
}
BOOL isEmpty(LQueue queue) {
return queue->rear == queue->front;
}
T popQueue(LQueue queue) {
if (isEmpty(queue)) return NULL;
queue->front = queue->front->Next;
return queue->front->element;
}
tree createNode(E elemet,int value){
tree node = malloc(sizeof (struct Tree));
node->left=node->right=NULL;
node->element = elemet;
node->value = value;
return node;
}
tree f(tree root){
if (root == NULL) return NULL;
printf("%c",root->element);
f(root->left);
f(root->right);
}
void fq(LQueue queue) {
printf(">>>");
Node tmp = queue->front;
do {
if (isEmpty(queue)) {
printf("队为空<<<\n");
return;
}
queue->front = queue->front->Next;
printf("%c ", queue->front->element->element);
} while (queue->front != queue->rear);
queue->front = tmp;
printf("<<<\n");
}
char * encode(tree root,E e){
if (root == NULL ) return NULL;
if (root->element == e) return "";
char * str = encode(root->left,e);
char * s = malloc(sizeof (char)*10);
if (str != NULL){
s[0] = '0';
str = strcat(s,str);
}else{
str = encode(root->right,e);
if (str != NULL){
s[0] = '1';
str = strcat(s,str);
}
}
return str;
}
void printCode(tree root, E e){
printf("%c的哈夫曼编码:%s", e,encode(root,'A'));
printf("\n");
}
int main() {
struct Queue queue;
initQueue(&queue);
pushQueue(&queue, createNode('A',5));
pushQueue(&queue, createNode('B',16));
pushQueue(&queue, createNode('C',8));
pushQueue(&queue, createNode('D',13));
fq(&queue);
while (queue.front->Next != queue.rear){
tree left = popQueue(&queue);
tree right = popQueue(&queue);
tree node = createNode(' ',left->value+right->value);
node->left = left;
node->right = right;
pushQueue(&queue,node);
}
tree root = popQueue(&queue);
printCode(root,'A');
printCode(root,'B');
printCode(root,'C');
printCode(root,'D');
}