关于数据结构c语言版 哈夫曼树的创建于select()函数的实现

关于数据结构c语言版

哈夫曼树的创建于select()函数的实现

代码如下:(具体注意事项已经在代码注释中表面,其中关键事项在最后表明)

//haffumanshu
//by wangjintao
typedef struct{
    
    
 int weight;
 int parent;
 int lchild;
 int rchild;
}HTNode,*HuffmanTree;
void CreateHuffmanTree(HuffmanTree *HT,int n);
void Select(HuffmanTree HT,int m,int *s1,int *s2); 
void outHuffmanTree(HuffmanTree HT,int n);
#include<stdlib.h>
#include<stdio.h>
int main(){
    
    
 int n;
 HuffmanTree HT;
 
 printf("下面进行huffmantree的创建\n请输入你想要输入的结点个数:\n");
 scanf("%d",&n);
 CreateHuffmanTree(&HT,n);
 printf("创建Huffman tree完成\n");
 //printf("%d",HT[4].lchild);
 //printf("%d %d",4,HT[4].weight);测试发现应该是没有create成功 
 //printf("%d %2d %6d %6d %6d",4,HT[4].weight,HT[4].parent,HT[4].lchild,HT[4].rchild);//说明这个create不一定成功 
 //intf("%d",HT[3].weight);
 outHuffmanTree(HT,n);//HT里边的值就是那棵哈夫曼树的地址,这样就需要考虑之前的单链表,与2叉数的问题了 
 
 return 0;
}
void CreateHuffmanTree(HuffmanTree *HT,int n){
    
    
 if(n<=1)
  return;
 int i;
 int s1,s2;
 *(HT)=(HTNode*)malloc(2*n*sizeof(HTNode));//huffmantree有其他辅助结点 
 for(i=0;i<=2*n;i++){
    
    
  (*HT)[i].lchild=0;(*HT)[i].parent=0;(*HT)[i].rchild=0; 
 }
 printf("请输入这n个结点的weight:"); 
 for(i=1;i<=n;i++)
  scanf("%d",&(*HT)[i].weight);
 for(i=n+1;i<2*n;i++){
    
    //进行n-1次的结合 //最后一个位置为2n-1 
  Select(*HT,i-1,&s1,&s2);//此时s1和s2里边就是那两个下标了,在下面的函数里边都是用到s1和s2而不是*s2 
  //select注意(*HT)因为你这个是在create函数里边,只有一个(*HT)它指向主程序里边一个变量,变量里的值就是那棵哈夫曼树的地址 
  //printf("%d,%d\n",s1,s2);//测试 
  (*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;
  (*HT)[s1].parent=i;
  (*HT)[s2].parent=i;
  (*HT)[i].lchild=s1;
  (*HT)[i].rchild=s2;
  //printf("%d\n",(*HT)[s1].parent);//测试 
 }
 
 
}
void Select(HuffmanTree HT,int m,int *s1,int *s2){
    
    //从这m个数里边选择最小的2个//把第一个进行标记就ok 
 int i;//从下标为1的位置开始计数 
 //int min=HT[1].weight;这里直接赋值不合理,假如第一次那个1就是最小被选选中,那么第2次还是被选中 
 int min1=1000; 
 int min2=1000;//规定一个特别大的数 
 
 for(i=1;i<=m;i++){
    
    
  if(HT[i].parent==0&&min1>HT[i].weight){
    
    
   min1=HT[i].weight;
   *s1=i;
  }
 }
 for(i=1;i<=m;i++){
    
    //注意这个I!=*s1标记min 
  if(i!=(*s1)&&HT[i].parent==0)
   if(HT[i].weight<min2){
    
    
    min2=HT[i].weight;
    *s2=i;
   }
  
 } 
}
void outHuffmanTree(HuffmanTree HT,int n){
    
    
 if(HT==NULL)
  printf("无huffmantree\n");
 int i;
 printf("输出huffmantree表格\n");
 printf("结点 weight parent lchild rchild\n");
 //printf("%d %2d %6d %6d %6d",i,HT[4].weight,HT[4].parent,HT[4].lchild,HT[4].rchild);//ceshi
 for(i=1;i<2*n;i++){
    
    //是2n-1个结点,申请了2n个位置0-2n-1(这是2n个用1-2n-1) 
  printf("%2d %6d %6d %6d %6d\n",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
 }
 
}

注意:1Select()函数在CreateHuffmanTree()函数内部注意(*HT)因为你这个是在create函数里边,只有一个(*HT)它指向主程序里边一个变量,变量里的值就是那棵哈夫曼树的地址

2 select()函数里边不能用 //int min=HT[1].weight;这里直接赋值不合理,假如第一次那个1就是最小被选选中,那么第2次还是被选中 这样下面的for(i=2;)
3注意函数的指针部分。

运行结果

8个数值

3个数值

猜你喜欢

转载自blog.csdn.net/qq_44218805/article/details/103401899