while (HT[i].Parent != 0 && i <= n)
时间: 2024-06-01 13:08:06 浏览: 9
这是一个 while 循环,它的条件是 HT[i].Parent != 0 && i <= n。
这个 while 循环的作用是遍历哈夫曼树中的节点,从根节点开始一直遍历到第 n 个叶子节点。具体地,i 是当前遍历到的节点的下标,n 是叶子节点的个数。HT[i].Parent 表示节点 i 的父节点的下标,当节点 i 的父节点为 0 时表示节点 i 是根节点。
因此,这个 while 循环的意义是从哈夫曼树的根节点出发,遍历到第 n 个叶子节点。如果某个节点的父节点为 0,那么说明该节点已经是根节点了,不需要再继续遍历。同时,如果 i 大于 n,也不需要再遍历下去了,因为已经遍历到了所有的叶子节点。
相关问题
以下代码有什么问题#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; }
在函数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;
}
```
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct HTNode { int weight; int parent,lchild,rchild; char data; }HTNode; typedef struct HCNode { int bit[200]; int start; }HCNode; HTNode ht[1005]; HCNode hc[200]; int str[1005]={0}; int num=0; void Select(int pos,int *x1,int *x2) { int m1=1000,m2=1000; int j; for(j=1;j<pos;j++) { if(ht[j].weight<m1&&ht[j].parent==0) { m2=m1;*x2=*x1; m1=ht[j].weight; *x1=j; } else if(ht[j].weight<m2&&ht[j].parent==0) { m2=ht[j].weight; *x2=j; } } } void init(int n) { int i,j,x1,x2; char c; for(i=1;i<=2*n-1;i++) { ht[i].weight=0; ht[i].lchild=0; ht[i].parent=0; ht[i].rchild=0; } for(i=1;i<=n;i++){ getchar(); scanf("%c",&ht[i].data); } for(i=1;i<=n;i++) scanf("%d",&ht[i].weight); for(i=1;i<n;i++) { Select(n+i,&x1,&x2); ht[x1].parent=n+i; ht[x2].parent=n+i; ht[n+i].weight=ht[x1].weight+ht[x2].weight; ht[n+i].lchild=x1; ht[n+i].rchild=x2; } } void getnum(int n) { int i,j; HCNode x; for(i=1;i<=n;i++) { x.start=n; int cur=i; int par=ht[cur].parent; while(par!=0) { if(ht[par].lchild==cur) x.bit[x.start]=0; else x.bit[x.start]=1; x.start--; cur=par; par=ht[cur].parent; } for(j=x.start+1;j<=n;j++) hc[i].bit[j]=x.bit[j]; hc[i].start=x.start+1; } } void print(int n) { char code[1000]; int i,j,k; scanf("%s",code); for(i=0;i<strlen(code);i++) { for(j=1;j<=n;j++) { if(code[i]==ht[j].data) { for(k=hc[j].start;k<=n;k++) { printf("%d",hc[j].bit[k]); str[num]=hc[j].bit[k]; num++; } } } } printf("\n"); } void decode(int n) { int i=0; int t; while(i<num) { t=2*n-1; while(ht[t].lchild!=0&&ht[t].rchild!=0) { if(str[i]==0) t=ht[t].lchild; else t=ht[t].rchild; i++; } printf("%c",ht[t].data); } } int main() { int n; scanf("%d",&n); init(n); getnum(n); print(n); decode(n); return 0; }
这是一个基于哈夫曼编码的编译码器,可以实现对给定信息的压缩和解压缩。代码中用结构体存储哈夫曼树的节点信息,包括权值、父节点、左孩子、右孩子和数据等。通过输入数据和权值,构建哈夫曼树,然后根据哈夫曼树生成每个字符对应的编码,将输入的信息按照编码进行压缩,并将压缩后的结果解码还原成原始的信息。
具体来说,代码中的主要函数有:
- Select:在已有节点中选出两个权值最小的节点。
- init:初始化哈夫曼树,包括输入数据和权值,构建哈夫曼树。
- getnum:根据哈夫曼树生成每个字符的编码。
- print:将输入的信息按照编码进行压缩,并输出压缩后的结果。
- decode:将压缩后的结果解码还原成原始的信息,并输出。
需要注意的是,在编码和解码的过程中,需要将不同字符的编码用不同的位数表示,以保证解压缩的正确性。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)