关于数据结构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个数值

  • 22
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
哈夫曼树是一种用于数据压缩的树形结构,它是根据数据出现的频率来构建的。在C语言中,我们可以使用数组和结构体来实现哈夫曼树。 首先,我们需要定义一个结构体来表示哈夫曼树的节点: ```c struct HuffmanNode { int data; // 数据 int weight; // 权重 int parent; // 父节点下标 int leftChild; // 左孩子下标 int rightChild; // 右孩子下标 }; ``` 然后,我们可以使用一个数组来存储所有的节点: ```c struct HuffmanNode huffmanTree[MAX_SIZE]; ``` 其中,`MAX_SIZE`是一个足够大的常量,用于限定哈夫曼树的最大节点数量。 接下来,我们需要构建哈夫曼树。这里以构建最小堆为例: ```c // 构建最小堆 void buildMinHeap(struct HuffmanNode huffmanTree[], int size) { for (int i = size / 2; i >= 1; i--) { adjustDown(huffmanTree, i, size); } } // 向下调整最小堆 void adjustDown(struct HuffmanNode huffmanTree[], int k, int size) { huffmanTree = huffmanTree[k]; for (int i = 2 * k; i <= size; i *= 2) { if (i < size && huffmanTree[i].weight > huffmanTree[i + 1].weight) { i++; } if (huffmanTree.weight <= huffmanTree[i].weight) { break; } huffmanTree[k] = huffmanTree[i]; k = i; } huffmanTree[k] = huffmanTree; } // 构建哈夫曼树 void buildHuffmanTree(struct HuffmanNode huffmanTree[], int weight[], int n) { if (n <= 1) { return; } int m = 2 * n - 1; // 哈夫曼树的节点数量 for (int i = 1; i <= n; i++) { huffmanTree[i].weight = weight[i]; huffmanTree[i].parent = 0; huffmanTree[i].leftChild = 0; huffmanTree[i].rightChild = 0; } for (int i = n + 1; i <= m; i++) { huffmanTree[i].weight = 0; huffmanTree[i].parent = 0; huffmanTree[i].leftChild = 0; huffmanTree[i].rightChild = 0; } for (int i = n + 1; i <= m; i++) { int min1, min2; selectMin(huffmanTree, i - 1, &min1, &min2); huffmanTree[min1].parent = i; huffmanTree[min2].parent = i; huffmanTree[i].leftChild = min1; huffmanTree[i].rightChild = min2; huffmanTree[i].weight = huffmanTree[min1].weight + huffmanTree[min2].weight; } } ``` 上述代码中,`buildMinHeap` 函数用于构建最小堆,`adjustDown` 函数用于向下调整最小堆,`buildHuffmanTree` 函数用于构建哈夫曼树。 最后,我们可以根据构建好的哈夫曼树来进行数据压缩和解压缩操作。具体的压缩和解压缩算法可以根据哈夫曼树的特性来设计。 希望以上信息对你有所帮助!如果还有其他问题,请继续提问。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值