优先队列实现huffman,有指针错误,求纠正
											
程序代码:/*
*优先队列实现哈夫曼树:哈夫曼树外部结点的个数为m,内部结点为m-1,所以总结点树为2m-1
*/
#include<stdio.h>
#include<stdlib.h>
#define MAX_PQ_SIZE 100
#define MAX_NUM 6
/*Haffuman tree data type define*/
struct HtNode        /*哈夫曼树结点的结构*/
{
    int ww;            /*以该结点为根的子树中所有外部结点的加权和*/
    int parent,llink,rlink;   
};
struct HtTree        /*哈夫曼树结构*/
{
    int m;            /*外部结点的个数*/
    int root;        /*哈夫曼树根在数组中的下标*/
    struct HtNode *ht; /*存放2*m-1个结点的数组*/
};
typedef struct HtTree *PHtTree;
typedef struct HtNode* element_type;
/*Priority tree datatype define*/
 struct heap_struct
{
    /*Maximum # that can fit in the heap*/
    unsigned int max_heap_size;
    /*Crurrent # of elements in the head*/
    unsigned int size;
    element_type *elements;
};
typedef struct heap_struct*PRIORITY_QUEUE;
PRIORITY_QUEUE create_pq(unsigned int max_elements)
{
    PRIORITY_QUEUE H;
    if(max_elements>MAX_PQ_SIZE)
    {
        printf("Priority queue size is too large\n");
        return NULL;
    }
        
    H=(PRIORITY_QUEUE)malloc(sizeof(struct heap_struct));
    if(NULL==H)
    {
        printf("Out of space!\n");
        return NULL;
    }
    /*Allocate the array + one extra for sentinel*/
    H->elements=(element_type*)malloc((max_elements+1)*sizeof(element_type));
    if(NULL==H->elements)
    {
        printf("Out of space!\n");
        free(H);
        return NULL;
    }
    H->max_heap_size=max_elements;
    H->size=0;
    H->elements[0]=NULL;
    return H;   
}
bool isEmptyPriorityQueue(PRIORITY_QUEUE H)
{
    return H->size==0;
}
/*H->elements[0] is a sentinel*/
void enQueue(element_type x,PRIORITY_QUEUE H)
{
    unsigned int i;
    if(H->size==H->max_heap_size)
        printf("Priority queue is full\n");
    else
    {
        i=++H->size; /*the position of new element*/
        while((i/2)!=0)/*compare with the value of the parent node*/
        {
            if((*(H->elements[i/2])).ww>(*x).ww)/*通过间接访问运算与父结点的值进行比较*/
            {
                H->elements[i]=H->elements[i/2];/*swap down*/
                i=i/2;
            }
            else
                break;
            H->elements[0]=x;    /*the final position*/
        }
    }
}
element_type deQueue(PRIORITY_QUEUE H)
{
    unsigned int i,child;
    element_type min_element,last_element;
    if(0==H->size)
    {
        printf("Priority queue if empty\n");
        return H->elements[0];
    }
    min_element=H->elements[1];
    last_element=H->elements[H->size--];
   
    for(i=1;i*2<=H->size;i=child)
    {
        /*find smaller child*/
        child=i*2;
        if((child!=H->size)&&((*H->elements[child+1]).ww<(*H->elements[child]).ww))
            child++;
        /*percolate one level*/
        if((*last_element).ww>(*H->elements[child]).ww)
            H->elements[i]=H->elements[child];/*child move up*/
        else
            break;/*is the smallest*/
    }
    H->elements[i]=last_element;/*set here*/
    return min_element;
}
element_type topPriorityQueue(PRIORITY_QUEUE H)
{
    if(isEmptyPriorityQueue(H))
    {
        printf("Priority queue is empty!\n");
        return H->elements[0];
    }
    else
        return H->elements[1];
}
PHtTree huffman(int m,int *w)/*构造具有m个外部结点的哈夫曼树*/
{
    PHtTree pht;/*declare a pointer to Huffman tree*/
    PRIORITY_QUEUE pq;/*declare a pointer to priority queue*/
    int i,m1,m2;
    struct HtNode x1,x2;/*two pointer of HtNode*/
    pht=(PHtTree)malloc(sizeof(struct HtTree));
    if(NULL==pht)
    {
        printf("Out of space!\n");
        return pht;
    }
    pht->ht=(struct HtNode*)malloc(sizeof(struct HtNode)*(2*m-1));
    if(NULL==pht)
    {
        printf("Out of space!\n");
        return pht;
    }
    for(i=0;i<2*m-1;i++)/*the array(ht) initializtion*/
    {
        pht->ht[i].llink=-1;
        pht->ht[i].rlink=-1;
        pht->ht[i].parent=-1;
        if(i<m)
            pht->ht[i].ww=w[i];
        else
            pht->ht[i].ww=-1;
    }
    pq=create_pq(MAX_NUM);/*分配优先队列空间 */
    for(i=0;i<m;i++)
    {
        enQueue(pht->ht+i,pq);/*注意:是将结点的地址加入优先队列*/
    }
    for(i=0;i<m-1;i++)/*需要构造m-1个内部结点*/
    {
        x1=NULL;
        x2=NULL;
       
        x1=topPriorityQueue(pq);/* 从优先队列里找两个最小权的无父结点的结点,存放在x1,x2中 */       
        x2=topPriorityQueue(pq);
        pht->x1->parent=m+i;/*填入指向父节点的下标信息*/
        pht->x2->parent=m+i;
        pht->ht[m+i].ww=m1+m2;    /*填入父节点的权重*/   
        pht->ht[m+i].llink=x1;/*填入父节点的左右儿子字段信息*/
        pht->ht[m+i].rlink=x2;
       
        enQueue(pht->ht+m+i.pq);/*将新构造的节点的地址插入优先队列*/
    }
    pht->root=2*m-2;/*指向根节点*/
    for(i=2*m-2;i>=0;i--)/*print Huffman tree*/
        printf("No.%2d,value =%3d,lLink =%2d,rLink =%2d,parent =%2d\n",i,pht->ht[i].ww,pht->ht[i].llink,pht->ht[i].rlink,pht->ht[i].parent);
    return pht;
}
int main()
{
    int weight[MAX_NUM]={12,3,56,7,8,32};
    huffman(MAX_NUM,weight);
    return 0;
}										
					
	


											
	    

	