/*author:windy_2*/
/*修正版*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct slink
{
char data;
int wp;
int bm;
int mark;
struct slink *left;
struct slink *right;
}*link;
struct hfm
{
char data;
int wp;
};
struct T
{
int data;
struct T *next;
};
struct te
{
int data;
struct te *next;
};
struct slink* create_tree(struct hfm arr[],int len);
void print(struct slink *root);
int pop();
void push(int k);
struct T *T;
struct te *te;
int pop_s(struct T *strack);
void push_t(int k);
int pop_t();
int main()
{
struct slink *root;
int i,k=0;
char str[20];
char a[20];
int b[20];
int count,j;
struct hfm *arr;
T = (struct T*)malloc(sizeof(struct T));
T->data = 0;
T->next = NULL;
te = (struct te*)malloc(sizeof(struct te));
te->data = 0;
te->next = NULL;
printf("请输入你要进行编码的字符串: \n");
scanf("%s",str);
if(str[strlen(str)] == '\0')
{
str[strlen(str)]=NULL;
}
for(i = 0;i < strlen(str);i++)
{
if(str[i]!='#')
{
a[k] = str[i];
b[k] = 0;
for(j = 0;j<strlen(str);j++)
{
if(str[j] == str[i])
{
b[k]++;
}
}
for(j = 0;j<strlen(str);j++)
{
if(str[j] == a[k])
{
str[j] = '#';
}
}
k++;
}
count = k;
}
arr = (struct hfm*)malloc(sizeof(struct hfm)*count);
for(i = 0;i < count;i++)
{
arr[i].data = a[i];
arr[i].wp = b[i];
}
root = (struct slink*)malloc(sizeof(struct slink));
root = create_tree(arr,count);
print(root);
}
struct slink* create_tree(struct hfm arr[],int len)
{
link ptrarr[20];
link ptr,root = NULL;
int i,k1 = -1,k2,j;
for(i = 0;i < len;i++)
{
ptr = (link)malloc(sizeof(struct slink));
ptr->data = arr[i].data;
ptr->wp = arr[i].wp;
ptr->mark = 0;
ptr->left = NULL;
ptr->right = NULL;
ptrarr[i] = ptr;
}
for(i = 1;i < len;i++)
{
for(j = 0;j < len;j++)
{
if(ptrarr[j]!=NULL&&k1==-1)
{
k1 = j;
continue;
}
if(ptrarr[j]!=NULL)
{
k2 = j;
break;
}
}
for(j = k2;j < len;j++)
{
if(ptrarr[j] != NULL)
{
if(ptrarr[j]->wp > ptrarr[k1]->wp)
{
k2 = k1;
k1 = j;
}
else if(ptrarr[j]->wp < ptrarr[k2]->wp)
{
k2 = j;
}
}
}
root = (link)malloc(sizeof(struct slink));
ptrarr[k1]->bm = 0;
ptrarr[k2]->bm = 1;
root->wp = ptrarr[k1]->wp + ptrarr[k2]->wp;
root->data = '!';
root->mark = 0;
root->left = ptrarr[k1];
root->right = ptrarr[k2];
ptrarr[k1] = root;
ptrarr[k2] = NULL;
}
return root;
}
void print(struct slink *root)
{
int temp;
struct T *p;
if(root == NULL)
{
return;
}
else
{
if(root->bm == 0||root->bm == 1)
{
push(root->bm);
}
if(root->data != '!')
{
printf("%c的哈夫曼编码为: ",root->data);
root->mark = 1;
temp = pop();
push_t(temp);
p = T->next;
while(p!=NULL)
{
temp = pop_s(p);
push_t(temp);
p = p->next;
}
while(te->next!=NULL)
{
temp = pop_t();
printf("%d",temp);
}
printf("\n");
if(root->bm == 1)
{
temp = pop();
}
}
print(root->left);
print(root->right);
}
}
int pop()
{
struct T *p;
int n;
if(T->next == NULL)
{
return 0;
}
else
{
p = T->next;
n = p->data;
T->next = p->next;
free(p);
return n;
}
}
void push(int k)
{
struct T *strack;
strack = (struct T*)malloc(sizeof(struct T));
strack->data = k;
strack->next = T->next;
T->next = strack;
}
int pop_s(struct T *strack)
{
struct T *p;
int n;
if(T->next == NULL)
{
return 0;
}
else
{
p = strack;
n = p->data;
return n;
}
}
void push_t(int k)
{
struct te *strack;
strack = (struct te*)malloc(sizeof(struct te));
strack->data = k;
strack->next = te->next;
te->next = strack;
}
int pop_t()
{
struct te *p;
int n;
if(te->next == NULL)
{
return -1;
}
else
{
p = te->next;
n = p->data;
te->next = p->next;
free(p);
return n;
}
}