请问这个程序错在哪里啊???求大神指教…… 20

//建立哈夫曼树及编码.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include<stdlib.h>#include<stdio.h>... // 建立哈夫曼树及编码.cpp : 定义控制台应用程序的入口点。
//
#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;
}
展开
 我来答
无人能渡我自渡
2012-12-25 · 超过26用户采纳过TA的回答
知道答主
回答量:62
采纳率:100%
帮助的人:51万
展开全部

// 建立哈夫曼树及编码.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;

}//所以说了这么多,我觉得楼主还是重新写一个吧,这个问题太多了

//关于树的概念还要再看看,再重新写一个,改起来太麻烦了。。。

 

 

追问
不好意思
请问您能发个完整的给我吗??
追答
你等等,今天没时间了。。。。。
没事来找哥
2012-12-25 · 超过15用户采纳过TA的回答
知道答主
回答量:68
采纳率:0%
帮助的人:42.1万
展开全部
http://zhidao.baidu.com/question/290690414.html楼主道这里看下有可能对你有帮助!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yuwen小童鞋
2012-12-25
知道答主
回答量:34
采纳率:0%
帮助的人:5.1万
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式