#include "stdafx.h"
#include<stdio.h>
#include <string.h>
#define max 27
#define wmax 32767
typedef struct
{
char data;
int weight;
int parent;
int left;
int right;
} huffnode;
void initTree(huffnode *phuff,char* pdata,int *pweight,int n)
{
huffnode *p=phuff;
for(int i=0;i<2*n-1;i++)
{
p->left=p->right=p->parent=-1;
p++;
}
p=phuff;
for(int j=0;j<n;j++)
{
p->weight=*pweight;
p->data=*pdata;
p++;
pweight++;
pdata++;
}
for(int k=n;k<2*n-1;k++)
{
phuff[k].weight=wmax;
}
}
void bulidTree(huffnode *phuff,int n)
{
int n1,n2;
int i=0,j=0;
int n2b;
for(j=n;j<2*n-1;j++)
{
/*从节点集合中取出没有父节点的两个最小权重的节点,存入n1,n2*/
for(i=0;i<2*n-2;i++)
{
if(phuff[i].parent==-1)
{
n1=i;
break;
}
}
for(i=n1+1;i<2*n-2;i++)
{
if(phuff[i].parent==-1)
{
n2=i;
i++;
break;
}
}
n2b=n2;
if(phuff[n1].weight>phuff[n2].weight)
{
int temp;
temp=n1;
n1=n2;
n2=n1;
}
for(i=n2b+1;i<2*n-2;i++)
{
if(phuff[i].parent==-1)
{
/*注意这里的比较条件*/
if((phuff[i].weight>=phuff[n1].weight)&&(phuff[i].weight<phuff[n2].weight))
{
n2=i;
}
if(phuff[i].weight<phuff[n1].weight)
{
n2=n1;
n1=i;
}
}
}
/*这里正式产生树结构*/
phuff[n1].parent=phuff[n2].parent=j;
phuff[j].weight=phuff[n1].weight+phuff[n2].weight;
phuff[j].left=n1;
phuff[j].right=n2;
}
}
void huffEncode(char ch,huffnode* phuff,int n,char *out)
{
int index=-1;
int parent,pos=0;
for(int i=0;i<n;i++)
{
if(phuff[i].data==ch)
{
index=i;
break;
}
}
if(index==-1)
{
printf("\nchar--%c invalid!\n",ch);
return;
}
parent=phuff[index].parent;
while(parent!=-1)
{
if(phuff[parent].left==index){ out[pos++]='0';}
else{ out[pos++]='1';}
index=parent;
parent=phuff[parent].parent;
}
out[pos]='\0';
strrev(out);
}
void huffEncodeString(char *pch,huffnode* phuff,int n,char *out)
{
int pos=0;
int pos1=0;
char out1[20];
while(pos<int(strlen(pch)))
{
huffEncode(pch[pos],phuff,n,out1);
pos1+=strlen(out1);
if(pos==0)
{
strcpy(out,out1);
}
else
{
strcat(out,out1);
}
pos++;
}
out[pos1]='\0';
}
void huffDecode(char *pch,huffnode* phuff,int n,char *out)
{
int pos=0;
int root=-1,node;
int pos1=0;
for(int i=0;i<2*n-1;i++)
{
if(phuff[i].parent==-1)
{
root=i;
break;
}
}
while(pos<int(strlen(pch)))
{
node=root;
while( (phuff[node].left!=-1) && (phuff[node].right!=-1))
{
if(pch[pos]=='0')
{
node=phuff[node].left;
}
else
{
node=phuff[node].right;
}
pos++;
}
out[pos1++]=phuff[node].data;
}
out[pos1]='\0';
}
int main()
{
huffnode ht[2*max-1];
int n=5;
char data[5]={'a','b','c','d','e'};
int j;
int weight[5]={1,2,4,5,7};
char out[200];
initTree(ht,data,weight,n);
bulidTree(ht,n);
printf("正在编码...\n");
huffEncodeString("abcde",ht,n,out);//这里的引号是怎么回事啊??,怎么样才能把我从屏幕上输入并放在数组里面的数放到引号里面
printf(" 编码完成,答案是-->%s\n",out);
printf("--------------------------------\n");
printf("正在译码 ...\n");
huffDecode("000001011011",ht,n,out);//还有这里,我怎么样才能把上面产生的结果直接放到引号里面,
printf("译码完成,结果是-->%s\n",out);
return 0;
}
我的问题是怎么样才能把我从屏幕上导入的数组放到引号里面,比如,我现在只能对abcde进行编码,但是如果
我想从对屏幕上输入并保存在数组里面的数进行编码,请问我该怎么做??,通理,译码也是这个问题
5 个解决方案
#1
char s[200];
scanf("%s",s) //从屏幕上输入字符串
huffEncodeString(s,ht,n,out);//这样就把你输入的字符串放到引号里了啊
scanf("%s",s) //从屏幕上输入字符串
huffEncodeString(s,ht,n,out);//这样就把你输入的字符串放到引号里了啊
#2
我把后面的一部分改成
int main()
{
huffnode ht[2*max-1];
int n=5;
char data[5];
scanf("%s",data);
int j;
int weight[5];
scanf("%s",weight);
char out[200];
initTree(ht,data,weight,n);
bulidTree(ht,n);
printf("正在编码...\n");
huffEncodeString(data,ht,n,out);
printf(" 编码完成,答案是-->%s\n",out);
printf("--------------------------------\n");
printf("正在译码 ...\n");
huffDecode(weight,ht,n,out);
printf("译码完成,结果是-->%s\n",out);
return 0;
可是还是不行啊??有谁能帮帮我吗??(不好意思,小弟还是菜鸟..... -_-'''
顺便问一下scanf("%s",&s)和scanf("%s",s)有什么区别啊
int main()
{
huffnode ht[2*max-1];
int n=5;
char data[5];
scanf("%s",data);
int j;
int weight[5];
scanf("%s",weight);
char out[200];
initTree(ht,data,weight,n);
bulidTree(ht,n);
printf("正在编码...\n");
huffEncodeString(data,ht,n,out);
printf(" 编码完成,答案是-->%s\n",out);
printf("--------------------------------\n");
printf("正在译码 ...\n");
huffDecode(weight,ht,n,out);
printf("译码完成,结果是-->%s\n",out);
return 0;
可是还是不行啊??有谁能帮帮我吗??(不好意思,小弟还是菜鸟..... -_-'''
顺便问一下scanf("%s",&s)和scanf("%s",s)有什么区别啊
#3
int main()
{
huffnode ht[2*max-1];
int n=5;
char data[5];
scanf("%s",data);
int j;
int weight[5];
scanf("%s",weight);
char out[200];
我不知道你用的是什么编译器,如果是tc2.0,那么上面的代码不会通过编译:因为你的变量声明应该集中写在程序首部,而不是像c++一样随用随写。
{
huffnode ht[2*max-1];
int n=5;
char data[5];
scanf("%s",data);
int j;
int weight[5];
scanf("%s",weight);
char out[200];
我不知道你用的是什么编译器,如果是tc2.0,那么上面的代码不会通过编译:因为你的变量声明应该集中写在程序首部,而不是像c++一样随用随写。
#4
scanf("%s",&s);//错误
scanf("%s",s);//正确
因为s是一个字符数组,所以前面不用再加上取地址符号&了。
scanf("%s",s);//正确
因为s是一个字符数组,所以前面不用再加上取地址符号&了。
#5
还有一个问题,我想把printf(" 编码完成,答案是-->%s\n",out);里面的那个out
取出来,然后用那个out来取代huffDecode("000001011011",ht,n,out);里面的那个000001011011,可是好像返回值不一样,出现出现错误error C2106: '=' : left operand must be l-value,我该怎么办啊??
取出来,然后用那个out来取代huffDecode("000001011011",ht,n,out);里面的那个000001011011,可是好像返回值不一样,出现出现错误error C2106: '=' : left operand must be l-value,我该怎么办啊??
#1
char s[200];
scanf("%s",s) //从屏幕上输入字符串
huffEncodeString(s,ht,n,out);//这样就把你输入的字符串放到引号里了啊
scanf("%s",s) //从屏幕上输入字符串
huffEncodeString(s,ht,n,out);//这样就把你输入的字符串放到引号里了啊
#2
我把后面的一部分改成
int main()
{
huffnode ht[2*max-1];
int n=5;
char data[5];
scanf("%s",data);
int j;
int weight[5];
scanf("%s",weight);
char out[200];
initTree(ht,data,weight,n);
bulidTree(ht,n);
printf("正在编码...\n");
huffEncodeString(data,ht,n,out);
printf(" 编码完成,答案是-->%s\n",out);
printf("--------------------------------\n");
printf("正在译码 ...\n");
huffDecode(weight,ht,n,out);
printf("译码完成,结果是-->%s\n",out);
return 0;
可是还是不行啊??有谁能帮帮我吗??(不好意思,小弟还是菜鸟..... -_-'''
顺便问一下scanf("%s",&s)和scanf("%s",s)有什么区别啊
int main()
{
huffnode ht[2*max-1];
int n=5;
char data[5];
scanf("%s",data);
int j;
int weight[5];
scanf("%s",weight);
char out[200];
initTree(ht,data,weight,n);
bulidTree(ht,n);
printf("正在编码...\n");
huffEncodeString(data,ht,n,out);
printf(" 编码完成,答案是-->%s\n",out);
printf("--------------------------------\n");
printf("正在译码 ...\n");
huffDecode(weight,ht,n,out);
printf("译码完成,结果是-->%s\n",out);
return 0;
可是还是不行啊??有谁能帮帮我吗??(不好意思,小弟还是菜鸟..... -_-'''
顺便问一下scanf("%s",&s)和scanf("%s",s)有什么区别啊
#3
int main()
{
huffnode ht[2*max-1];
int n=5;
char data[5];
scanf("%s",data);
int j;
int weight[5];
scanf("%s",weight);
char out[200];
我不知道你用的是什么编译器,如果是tc2.0,那么上面的代码不会通过编译:因为你的变量声明应该集中写在程序首部,而不是像c++一样随用随写。
{
huffnode ht[2*max-1];
int n=5;
char data[5];
scanf("%s",data);
int j;
int weight[5];
scanf("%s",weight);
char out[200];
我不知道你用的是什么编译器,如果是tc2.0,那么上面的代码不会通过编译:因为你的变量声明应该集中写在程序首部,而不是像c++一样随用随写。
#4
scanf("%s",&s);//错误
scanf("%s",s);//正确
因为s是一个字符数组,所以前面不用再加上取地址符号&了。
scanf("%s",s);//正确
因为s是一个字符数组,所以前面不用再加上取地址符号&了。
#5
还有一个问题,我想把printf(" 编码完成,答案是-->%s\n",out);里面的那个out
取出来,然后用那个out来取代huffDecode("000001011011",ht,n,out);里面的那个000001011011,可是好像返回值不一样,出现出现错误error C2106: '=' : left operand must be l-value,我该怎么办啊??
取出来,然后用那个out来取代huffDecode("000001011011",ht,n,out);里面的那个000001011011,可是好像返回值不一样,出现出现错误error C2106: '=' : left operand must be l-value,我该怎么办啊??