C语言的问题,请大家一定要帮帮我好吗??

wsg315200 2002-05-27 06:44:55

#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进行编码,但是如果
我想从对屏幕上输入并保存在数组里面的数进行编码,请问我该怎么做??,通理,译码也是这个问题
...全文
72 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsg315200 2002-05-27
  • 打赏
  • 举报
回复
还有一个问题,我想把printf(" 编码完成,答案是-->%s\n",out);里面的那个out
取出来,然后用那个out来取代huffDecode("000001011011",ht,n,out);里面的那个000001011011,可是好像返回值不一样,出现出现错误error C2106: '=' : left operand must be l-value,我该怎么办啊??
garfield_82 2002-05-27
  • 打赏
  • 举报
回复
scanf("%s",&s);//错误

scanf("%s",s);//正确

因为s是一个字符数组,所以前面不用再加上取地址符号&了。
garfield_82 2002-05-27
  • 打赏
  • 举报
回复
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++一样随用随写。
wsg315200 2002-05-27
  • 打赏
  • 举报
回复
我把后面的一部分改成
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)有什么区别啊

ckc 2002-05-27
  • 打赏
  • 举报
回复
char s[200];
scanf("%s",s) //从屏幕上输入字符串
huffEncodeString(s,ht,n,out);//这样就把你输入的字符串放到引号里了啊

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧