以下代码有什么问题#include<stdio.h> #include<stdlib.h> typedef struct HTNode{ int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; void Select(HuffmanTree HT,int n,int *min1,int *min2){ for(int i=1;i<=n;i++){ if(HT[i].parent==0){ *min1=i; break; } } for(int i=1;i<=n;i++){ if((HT[i].weight<HT[*min1].weight)&&HT[i].parent==0){ *min1=i; } } for(int i=1;i<=n;i++){ if((HT[i].parent==0)&&(i!=*min1)){ *min2=i; break; } for(int j=1;j<=n;j++){ if((HT[j].parent==0)&&(j!=*min1)&&(HT[j].weight<HT[*min2].weight)) *min2=j; } } } void createhuffmantree(HuffmanTree *HT,int n){ if(n<=1) return; int m=2*n-1;//一定要记得写*,最后一个结点的下标 (*HT)=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0号单元未用 for(int i=1;i<=m;i++) { (*HT)[i].parent=0; (*HT)[i].lchild=0; (*HT)[i].rchild=0; } for(int i=1;i<=n;i++) scanf("%d",&(*HT)[i].weight); int min1,min2; for(int i=n+1;i<=m;i++){ Select(*HT,i-1,&min1,&min2); (*HT)[min1].parent=i; (*HT)[min2].parent=i; (*HT)[i].lchild=min1; (*HT)[i].rchild=min2; (*HT)[i].weight=(*HT)[min1].weight+(*HT)[min2].weight; } } int weight(HuffmanTree HT,int n){ int sum=0; for(int i=1;i<=n;i++){ int j=i; int num=0; while(HT[j].parent!=0){ j=HT[j].parent; num++; } sum+=num*HT[i].weight; } return sum; } int main(){ int n; scanf("%d",&n); HuffmanTree HT; createhuffmantree(&HT,n); int sum=weight(HT,n); printf("%d",sum); return 0; }
时间: 2023-12-02 22:06:24 浏览: 70
哈夫曼编码可以对字母任意编码 基于C语言 初学者适用
在函数Select中,第二个for循环的右括号位置不正确,应该放在第三个for循环的前面,以保证语义正确。具体来说,应该将第二个for循环的右括号放在第14行的后面,即:
```
for(int i=1;i<=n;i++){
if((HT[i].parent==0)&&(i!=*min1)){
*min2=i;
break;
}
}
for(int j=1;j<=n;j++){
if((HT[j].parent==0)&&(j!=*min1)&&(HT[j].weight<HT[*min2].weight))
*min2=j;
}
```
阅读全文