我正在学数据结构,在写哈夫曼代码的时候出现了点问题
输入和生成哈夫曼树都是没问题的,但是执行程序中无法输出哈夫曼代码(HuffmanCode)不知道是在生成HuffmanCode时出了问题还是在最后输出HuffmanCode时出了问题
typedef struct{
int weight;
int parent;
int lchild;
int rchild;
}HTNode,*HuffmanTree;
//定义Huffmantree结构
typedef char**HuffmanCode;
void CreateHuffmanTree(HuffmanTree *HT,int n);
void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n);
void Select(HuffmanTree HT,int m,int *s1,int *s2);
void outHuffmanTree(HuffmanTree HT,int n);
void outHuffmanCode(HuffmanCode HC,int n);
#include
#include
#include<string.h>
int main(){
int n;
HuffmanTree HT;
HuffmanCode HC;
printf("下面进行huffmantree的创建\n请输入你想要输入的结点个数:\n");
scanf("%d",&n);
CreateHuffmanTree(&HT,n);
printf("创建Huffman tree完成\n");
outHuffmanTree(HT,n);
void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n);
outHuffmanCode(HC,n);
printf("创建Huffman Code完成\n");
return 0;
}
//主程序
void CreateHuffmanTree(HuffmanTree *HT,int n){
if(n<=1)
return;
int i;
int s1,s2;
*(HT)=(HTNode*)malloc(2*n*sizeof(HTNode));//huffmantree有其他辅助结点
for(i=0;i<=2*n;i++){
(*HT)[i].lchild=0;(*HT)[i].parent=0;(*HT)[i].rchild=0;
}
printf("请输入这n个结点的weight:");
for(i=1;i<=n;i++)
scanf("%d",&(*HT)[i].weight);
for(i=n+1;i<2*n;i++)
{
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;
}
}
//生成Huffmantree
void Select(HuffmanTree HT,int m,int *s1,int *s2){//从这m个数里边选择最小的2个//把第一个进行标记就ok
int i;//从下标为1的位置开始计数
//int min=HT[1].weight;这里直接赋值不合理,假如第一次那个1就是最小被选选中,那么第2次还是被选中
int min1=1000;
int min2=1000;//规定一个特别大的数
for(i=1;i<=m;i++){
if(HT[i].parent==0&&min1>HT[i].weight){
min1=HT[i].weight;
*s1=i;
}
}
for(i=1;i<=m;i++){
if(i!=(*s1)&&HT[i].parent==0)
if(HT[i].weight[i].weight;
*s2=i;
}
}
}
//选择最小的两个叶子节点
void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n){
HC=(HuffmanCode)malloc((n+1)*sizeof(char));
char cd[n-1];
cd[n-1]='\0';
int i,start,parent,c;
for(i=1;i<=n;i++)
{
start=n-1;parent=HT[i].parent;c=i;
while(parent!=0)
{
start--;
if(HT[parent].lchild==c) cd[start]='0';
else cd[start]='1';
c=parent;parent=HT[parent].parent;
}
HC[i]=new char [n-start];
strcpy(HC[i],&cd[start]);
}
free(cd);
}
//生成Huffmancode
void outHuffmanTree(HuffmanTree HT,int n){
if(HT==NULL)
printf("无huffmantree\n");
int i;
printf("输出huffmantree表格\n");
printf("结点 weight parent lchild rchild\n");
//printf("%d %2d %6d %6d %6d",i,HT[4].weight,HT[4].parent,HT[4].lchild,HT[4].rchild);//ceshi
for(i=1;i<2*n;i++){
printf("%2d %6d %6d %6d %6d\n",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
}
//输出Huffmantree
}
void outHuffmanCode(HuffmanCode HC,int n){
if(HC==NULL)
printf("无huffmancode\n");
int i;
printf("输出huffmancode表格\n");
printf("结点 code\n");
//printf("%d %2d %6d %6d %6d",i,HT[4].weight,HT[4].parent,HT[4].lchild,HT[4].rchild);//ceshi
for(i=1;i<=n;i++){
printf("%2d %d\n",i,HC[i]);
}
}
//输出Huffmancode
不知道你这个问题是否已经解决, 如果还没有解决的话:
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^