哈弗曼编码 标记处不能正确输出 求大神解答啊该怎么处理

哈弗曼编码 标记处不能正确输出 求大神解答啊
算法作业 明天就要交啦 大神门赶紧帮帮忙吧
#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就会报错,楼主,你是输入什么数据。。。
探讨
目前就那里有错误
就是有printf("%d",q->num);时下边的printf会换行
没有的话就不会换行

------解决方案--------------------
打印ddd报错,是因为他把a改了,a="";
------解决方案--------------------

你在printf("%d",q->num);之前之后都加个getchar();函数,运行看看是不是这一句的问题