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

时间:2023-01-09 19:51:31

#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);//这样就把你输入的字符串放到引号里了啊

#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)有什么区别啊
 

#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++一样随用随写。

#4


scanf("%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,我该怎么办啊??

#1


char s[200];
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)有什么区别啊
 

#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++一样随用随写。

#4


scanf("%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,我该怎么办啊??