求大神帮解决,小弟谢过!该如何解决
求大神帮解决,小弟谢过!
自己不会对下面代码纠错(其中select函数和主函数最后加),只求大神帮解决以下代码中的问题,求指出问题所在,并改正,不是求代码,因为始终不是自己写的
!!!不是求代码!
#include "stdio.h"
#include "stdlib.h"
typedef struct{
unsigned int weight; //权值
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配一维数组存储赫夫曼树
typedef char **HuffmanCode; //动态分配二维数组存储赫夫曼编码表
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){
//存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC。
if(n<=1) return;
int m=0;
int i=0;
int k=0;
m=2*n-1;
*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0号单元未用
//如果不是二级指针的话,只是一级指针,又不返回这个指针,申请的内存就无法得到了
HTNode *p;
p=(HT+1);
for(p,i=1;i<=n;++i,++p,++w) *p={*w,0,0,0};
for(;i<=m;++i,++p) *p={0,0,0,0};
for(i=n+1;i<=m;++i){ //建赫夫曼树
//在HT[1..i-1]选择parent为0且weight最小的两个结点,其序号分别为s1和s2.
int s1,s2;
select(HT,i-1,s1,s2);
HT[s1].parent=i; HT[s2].parent=i;
HT[i].lchild=s1; HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
//---从叶子到根逆向求每个字符的赫夫曼编码---
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));//分配n个字符编码的头指针向量
char cd;
cd=(char *)malloc(n*sizeof(char)); //分配求编码的空间
cd[n-1]="\0"; //编码结束符
for(i=1;i<=n;++i){ //逐个字符求赫夫曼编码
int start=0;
int c,f;
start=n-1; //编码结束符位置
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)//从叶子到根逆向求编码
if(HT[f].lchld==c) cd[--start]="0";
else cd[--start]="1";
HC[i]=(char *)malloc((n-start)*sizeof(char));//为第i个字符编码分配空间
strcpy(HC[i],&cd[start]);
}
free(cd);
}
void Decoding(HuffmanTree HT,int m,char *buff){
int p=m;
while(*buff!='\0'&&p!=0){
if(*buff=='0')
p=HT[p].lchild;
else p=HT[p].rchild;
buff++;
if(!HT[p].lchild&&!HT[p].rchild){
count<<HT[p].ch;
p=m; }
}
}
------解决方案--------------------
上下文可能有影响,最好将主干逻辑贴出来,如main()里面是怎样调用的.
自己不会对下面代码纠错(其中select函数和主函数最后加),只求大神帮解决以下代码中的问题,求指出问题所在,并改正,不是求代码,因为始终不是自己写的
!!!不是求代码!
#include "stdio.h"
#include "stdlib.h"
typedef struct{
unsigned int weight; //权值
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配一维数组存储赫夫曼树
typedef char **HuffmanCode; //动态分配二维数组存储赫夫曼编码表
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){
//存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC。
if(n<=1) return;
int m=0;
int i=0;
int k=0;
m=2*n-1;
*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0号单元未用
//如果不是二级指针的话,只是一级指针,又不返回这个指针,申请的内存就无法得到了
HTNode *p;
p=(HT+1);
for(p,i=1;i<=n;++i,++p,++w) *p={*w,0,0,0};
for(;i<=m;++i,++p) *p={0,0,0,0};
for(i=n+1;i<=m;++i){ //建赫夫曼树
//在HT[1..i-1]选择parent为0且weight最小的两个结点,其序号分别为s1和s2.
int s1,s2;
select(HT,i-1,s1,s2);
HT[s1].parent=i; HT[s2].parent=i;
HT[i].lchild=s1; HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
//---从叶子到根逆向求每个字符的赫夫曼编码---
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));//分配n个字符编码的头指针向量
char cd;
cd=(char *)malloc(n*sizeof(char)); //分配求编码的空间
cd[n-1]="\0"; //编码结束符
for(i=1;i<=n;++i){ //逐个字符求赫夫曼编码
int start=0;
int c,f;
start=n-1; //编码结束符位置
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)//从叶子到根逆向求编码
if(HT[f].lchld==c) cd[--start]="0";
else cd[--start]="1";
HC[i]=(char *)malloc((n-start)*sizeof(char));//为第i个字符编码分配空间
strcpy(HC[i],&cd[start]);
}
free(cd);
}
void Decoding(HuffmanTree HT,int m,char *buff){
int p=m;
while(*buff!='\0'&&p!=0){
if(*buff=='0')
p=HT[p].lchild;
else p=HT[p].rchild;
buff++;
if(!HT[p].lchild&&!HT[p].rchild){
count<<HT[p].ch;
p=m; }
}
}
------解决方案--------------------
上下文可能有影响,最好将主干逻辑贴出来,如main()里面是怎样调用的.