哈弗曼编码 标记处不能正确输出 求大神解答啊该怎么处理
哈弗曼编码 标记处不能正确输出 求大神解答啊
算法作业 明天就要交啦 大神门赶紧帮帮忙吧
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "malloc.h"
#define SIZE 50
struct haf
{
int num;
struct haf *right;
struct haf *left;
};
void
creat(int n,struct haf *arr)
{
int i;
for(i=0;i<n;i++)
{
scanf("%d",&(arr[i].num));
arr[i].right=NULL;
arr[i].left=NULL;
}
}
void
compa(int n,int i,struct haf *arr )
{
int j,v;
for(i;i<n;i++)
{ v=i;
if(i!=n-1)
{
for(j=i+1;j<n;j++)
{
if(arr[j].num<arr[v].num)
v=j;
}
swap(arr+i,arr+v);
}
}
}
int
swap(struct haf *arr1,struct haf *arr2)
{
int t;
t=arr1->num;
arr1->num=arr2->num;
arr2->num=t;
return 0;
}
struct haf *
tree(int n,int i,struct haf *arr)
{
struct haf *p;
if(i==n-1)
return &arr[n-1]; /*返回树根的指针*/
else
{
arr[n].num=arr[i].num+arr[i+1].num;
arr[n].left=&arr[i];
arr[n].right=&arr[i+1];
compa(n+1,i+2,arr); /*为每次新的哈弗曼结构排序并取最小的两个*/
p=tree(n+1,i+2,arr) ; /*递归构造哈夫曼树*/
return p;
}
}
void
code(struct haf *q,char *a)
{
char *b;
if(q->left==NULL&&q->right==NULL)
{
printf("%d",q->num); 这里不能正确输出
printf("%s\n",a);
return ;
}
else
{
b=(char *)malloc(20);
strcpy(b,a);
if(q->left!=NULL)
{strcat(a,"0") ;
code(q->left,a) ;
strcpy(a,b);}
if(q->right!=NULL)
{
strcat(a,"1");
code(q->right,a);
strcpy(a,b);
}
return ;
}
}
main()
{
int n ;
char *a;
struct haf arr[SIZE];
struct haf *q;
a=(char *)malloc(20);
a="";
printf("please input the number:");
scanf("%d",&n);
printf("please input the arr:\n");
creat(n,arr); /*为编码的数字构造结构*/
compa(n,0,arr);/*将数字排序*/
q=tree(n,0,arr); /*构造哈夫曼树*/
printf("ddd");
code(q,a);
getch();
}
------解决方案--------------------
把printf("%d",q->num)注释掉后,printf("%s\n",a)中的\n就不起作用了?
这不可能吧,完全挨不着边嘛。
------解决方案--------------------
我怎么输入数组,打印出 ddd就会报错,楼主,你是输入什么数据。。。
------解决方案--------------------
打印ddd报错,是因为他把a改了,a="";
------解决方案--------------------
你在printf("%d",q->num);之前之后都加个getchar();函数,运行看看是不是这一句的问题
算法作业 明天就要交啦 大神门赶紧帮帮忙吧
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "malloc.h"
#define SIZE 50
struct haf
{
int num;
struct haf *right;
struct haf *left;
};
void
creat(int n,struct haf *arr)
{
int i;
for(i=0;i<n;i++)
{
scanf("%d",&(arr[i].num));
arr[i].right=NULL;
arr[i].left=NULL;
}
}
void
compa(int n,int i,struct haf *arr )
{
int j,v;
for(i;i<n;i++)
{ v=i;
if(i!=n-1)
{
for(j=i+1;j<n;j++)
{
if(arr[j].num<arr[v].num)
v=j;
}
swap(arr+i,arr+v);
}
}
}
int
swap(struct haf *arr1,struct haf *arr2)
{
int t;
t=arr1->num;
arr1->num=arr2->num;
arr2->num=t;
return 0;
}
struct haf *
tree(int n,int i,struct haf *arr)
{
struct haf *p;
if(i==n-1)
return &arr[n-1]; /*返回树根的指针*/
else
{
arr[n].num=arr[i].num+arr[i+1].num;
arr[n].left=&arr[i];
arr[n].right=&arr[i+1];
compa(n+1,i+2,arr); /*为每次新的哈弗曼结构排序并取最小的两个*/
p=tree(n+1,i+2,arr) ; /*递归构造哈夫曼树*/
return p;
}
}
void
code(struct haf *q,char *a)
{
char *b;
if(q->left==NULL&&q->right==NULL)
{
printf("%d",q->num); 这里不能正确输出
printf("%s\n",a);
return ;
}
else
{
b=(char *)malloc(20);
strcpy(b,a);
if(q->left!=NULL)
{strcat(a,"0") ;
code(q->left,a) ;
strcpy(a,b);}
if(q->right!=NULL)
{
strcat(a,"1");
code(q->right,a);
strcpy(a,b);
}
return ;
}
}
main()
{
int n ;
char *a;
struct haf arr[SIZE];
struct haf *q;
a=(char *)malloc(20);
a="";
printf("please input the number:");
scanf("%d",&n);
printf("please input the arr:\n");
creat(n,arr); /*为编码的数字构造结构*/
compa(n,0,arr);/*将数字排序*/
q=tree(n,0,arr); /*构造哈夫曼树*/
printf("ddd");
code(q,a);
getch();
}
------解决方案--------------------
把printf("%d",q->num)注释掉后,printf("%s\n",a)中的\n就不起作用了?
这不可能吧,完全挨不着边嘛。
------解决方案--------------------
我怎么输入数组,打印出 ddd就会报错,楼主,你是输入什么数据。。。
------解决方案--------------------
打印ddd报错,是因为他把a改了,a="";
------解决方案--------------------
你在printf("%d",q->num);之前之后都加个getchar();函数,运行看看是不是这一句的问题