请问这个程序错在哪里啊???求大神指教…… 20
//
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
typedef struct
{
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char** HuffmanCode;
void selectMin(HuffmanTree &Ht,int i,int *s1,int *s2)
{
int j;
*s1=0;
*s2=0;
for(j=1;j<i;j++)
{
if((Ht+j)->parent<(Ht+*s1)->parent)
*s1=j;
if((Ht+j)->parent<*s2&&(Ht+*s2)->parent>(Ht+*s1)->parent)
*s2=j;
}
}
void strcopy(HuffmanCode Hc,char *cd)
{
*Hc=cd;
}
void HuffmanCreat(HuffmanTree &Ht,HuffmanCode &Hc,int *w,int n)
{
int s1,s2,m,i,start,f,c;
HuffmanTree p;
char *cd;
if(n<=1)
{
printf("输入有误,请重新输入:\n");
return;
}
m=n*2-1;
Ht=(HuffmanTree )malloc((m+1)*sizeof(HTNode));
for(p=Ht,i=1;i<=n;i++,p++,w++)
{
p->parent=0;
p->lchild=0;
p->rchild=0;
p->weight=*w;
}
for(;i<=m;i++)
{
p->parent=0;
p->lchild=0;
p->rchild=0;
p->weight=0;
}
for(i=n+1;i<=m;i++)
{
selectMin(Ht,i-1,&s1,&s2);
(Ht+s1)->parent=i;
(Ht+s2)->parent=i;
(Ht+i)->lchild=s1;
(Ht+i)->rchild=s2;
(Ht+i)->parent=(Ht+s1)->parent+(Ht+s2)->parent;
}
Hc=(HuffmanCode)malloc((n+1)*sizeof(char *));
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;i++)
{
start=n-1;
for(c=i,f=(Ht+i)->parent;f!=0;c=f,f=(Ht+f)->parent)
if((Ht+f)->lchild==c)
cd[--start]='0';
else
cd[--start]='1';
Hc[i]=(char *)malloc((n-start)*sizeof(char));
strcopy(Hc+i,&cd[start]);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HuffmanTree Ht;
HuffmanCode Hc;
int n,*w;
printf("请输入您要编码的字符的个数:\n");
scanf("%d",&n);
w=(int *)malloc(sizeof(int)*n);
printf("请输入您输入的需编码的字符的权值:\n");
for(int i=0;i<n;i++)
scanf("%d",w++);
HuffmanCreat(Ht,Hc,w,n);
printf("编码后的结果为:");
for(int i=0;i<n;i++)
printf("%s\n",*Hc);
return 0;
} 展开
// 建立哈夫曼树及编码.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>
typedef struct {
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char** HuffmanCode;
void selectMin(HuffmanTree &Ht,int i,int &s1,int &s2)//楼主的意思是可以改变参数S1S2吧
{
int j;
//*s1=0;
//*s2=0;//把传进来的形参值改变,楼主这是干嘛?
for(j=1;j<i;j++)
{
if((Ht+j)->parent<(Ht+s1)->parent) //楼主这里比较父节点无意义,
//创建的时候都是赋值0,比较是毫无意义的
s1=j;
if((Ht+j)->parent<s2 && (Ht+s2)->parent>(Ht+s1)->parent)
s2=j;
}
}
void strcopy(HuffmanCode Hc,char *cd)
{
*Hc=cd;
}
void HuffmanCreat(HuffmanTree &Ht,HuffmanCode &Hc,int *w,int n)
{
int s1,s2,m,i,start,f,c;
HuffmanTree p;
char *cd;
if(n<=1)//有一个结点的时候也是对的吧?
{
printf("输入有误,请重新输入:\n");
return;
}
m=n*2-1;
Ht=(HuffmanTree )malloc((m+1)*sizeof(HTNode));
for(p=Ht,i=1;i<=n;i++,p++,w++)
{
p->parent=0;//孩子结点,父节点都赋值为0了,上面的比较毫无意义了
p->lchild=0;
p->rchild=0;
p->weight=w[i-1];
}
for(;i<=m;i++)
{
p->parent=0;//这里的巴多分配的空间赋值为0,想法不错
p->lchild=0;//避免比较到了后面未赋值的结点,造成错误
p->rchild=0;
p->weight=0;
}
for(i=n+1;i<=m;i++)
{
selectMin(Ht,i-1,s1,s2);//如果上面的函数两个IF都为假
(Ht+s1)->parent=i; //你觉得这个函数改变了S1S2的值么
(Ht+s2)->parent=i;
(Ht+i)->lchild=s1;
(Ht+i)->rchild=s2;//那么S1、S2都是未赋值的,下面一句将发生未定义的行为
(Ht+i)->parent=(Ht+s1)->parent+(Ht+s2)->parent;
}
Hc=(HuffmanCode)malloc((n+1)*sizeof(char *));
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;i++)
{
start=n-1;
for(c=i,f=(Ht+i)->parent;f!=0;c=f,f=(Ht+f)->parent)
if((Ht+f)->lchild==c)
cd[--start]='0';
else
cd[--start]='1';
Hc[i]=(char *)malloc((n-start)*sizeof(char));
strcopy(Hc+i,&cd[start]);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HuffmanTree Ht;
HuffmanCode Hc;
int n,*w;
printf("请输入您要编码的字符的个数:\n");
scanf("%d",&n);
//w=(int *)malloc(sizeof(int)*n);
printf("请输入您输入的需编码的字符的权值:\n");
for(int i=0;i<n;i++)
scanf("%d",&w[i]);//这里如果用W++,输入值没有赋值进去,
//附图
HuffmanCreat(Ht,Hc,w,n);
printf("编码后的结果为:");
for(int i=0;i<n;i++)
printf("%s\n",*Hc);
return 0;
}//所以说了这么多,我觉得楼主还是重新写一个吧,这个问题太多了
//关于树的概念还要再看看,再重新写一个,改起来太麻烦了。。。
不好意思
请问您能发个完整的给我吗??
你等等,今天没时间了。。。。。