Daddy_Charlie_1 发表于 2022-7-27 20:15:31

哈夫曼树的建立

用一个结构体指针数组存储待合并的二叉树的根节点地址。每次合并两个根结点权值最小二叉树,将其中一个指针修改为新树根节点,另一个置为NULL,直到只剩一棵树。

问题:在初始化n棵树的根节点时,为何给结构体指针指向的成员变量赋值后,在循环体里和循环体外输出的结果会不一样。

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;

//结点
typedef struct HTNode{
    ElemType data;
    struct HTNode *lchild,*rchild;
}HTNode,*HTree;

//选择两个权值最小的结点
void Select(HTree *nodes,int *n1,int *n2,int n){

    for(int i=0;i<n;i++){
            if(nodes!=NULL){
                if((*n1)==-1||nodes->data<nodes[(*n1)]->data)
                  (*n1)=i;
            }
    }

    for(int i=0;i<n;i++){
            if(nodes!=NULL&&i!=(*n1)){
                if((*n2)==-1||nodes->data<nodes[(*n2)]->data)
                  (*n2)=i;
            }
    }

}

void CreateHT(HTree *HT){
   int n;
   scanf("%d",&n);

    //创建一个结构体指针数组,每个元素为HTree结构体指针类型
    HTree *nodes=(HTree*)malloc(sizeof(HTree));

    for(int i=0;i<n;i++){
      //生成原始二叉树
      nodes=(HTree)malloc(sizeof(HTNode));
      scanf("%d",&(nodes->data));
   
        printf("%d,%d ",nodes,nodes->data);   //测试1

      nodes->lchild=NULL;
      nodes->rchild=NULL;
    }

    //测试2
    printf("\n-----------\n");
    for(int i=0;i<n;i++){
      printf("%d,%d ",nodes,nodes->data);
    }

    //进行n-1次合并,找到两个权值最小的
    for(int i=1;i<n;i++){
      int n1=-1,n2=-1;
      Select(nodes,&n1,&n2,n);
      HTree p=(HTree)malloc(sizeof(HTNode));
      p->data=nodes->data+nodes->data;
      p->lchild=nodes;
      p->rchild=nodes;
      nodes=p;
      nodes=NULL;
    }
    //找到根节点
    for(int i=0;i<n;i++)
      if(nodes!=NULL){
            (*HT)=nodes;
            break;
      }
}


int main(){
    HTree HT;
    CreateHT(&HT);
    return 1;

}



错误案例:
输入:
5
1 2 3 4 5

输出:
12325952,1 12325984,2 12326016,3 12326048,4 12326080,5
-----------
12325952,12326080 12325984,2 12326016,3 12326048,4 12326080,5


风车呼呼呼 发表于 2022-7-27 22:41:32

我运行出来是一样的

5
1 2 3 4 5
10773736,1 10770232,2 10770288,3 10815312,4 10815368,5
-----------
10773736,1 10770232,2 10770288,3 10815312,4 10815368,5
页: [1]
查看完整版本: 哈夫曼树的建立