求个人帮我看看这个哈夫曼算法对不对

#include<stdio.h>
#include<stdlib.h>
typedef struct tree
{
int a;
struct tree *l;
struct tree *r;
}tree,*btree;
int i;
int e;
void make(btree &T,int b[])
{
btree n[6];
btree p;
for(i=0;i<6;i++)
{
n[i]=(btree)malloc(sizeof(tree));
n[i]->a=b[i];
n[i]->l=n[i]->r=NULL;
}
int j,k;
int q[2],h;
for(i=0;i<5;i++)
{
h=0;
for(e=0;e<6;e++)
{
k=0;
for(j=0;j<6;j++)
{
if(b[e]<=b[j])
{
k++;
}
}
if(k==6||k==5)
{
q[h]=e;
h++;
}
if(h==2)
{
break;
}
}
p=(btree)malloc(sizeof(tree));
p->a=b[q[1]]+b[q[0]];
if(b[q[0]]>b[q[1]])
{
p->l=n[q[1]];
p->r=n[q[0]];
}
b[q[1]]=b[q[0]]+b[q[1]];
b[q[0]]=10000;
n[q[1]]=p;
}
T=p;
}
void nice(btree T)
{
if(T!=NULL)
{
printf("%d",T->a);
nice(T->l);
nice(T->r);
}
}
int main()
{
int b[6]={10,35,40,50,60,200};
btree T;
make(T,b);
nice(T);
return 0;

}

错肯定是错的,一运行就会崩溃。p=(btree)malloc(sizeof(tree));后,应该立即将l和r设置为NULL
其次是整个逻辑,搞不清楚。
n[q[1]]=p;肯定有问题,n是btree,malloc分配了空间,却在这里又指向一个p,原来分配的空间就成了野指针了。
最后T=p,这个p到底指向哪个呢???

请用代码块放代码