大神帮忙看看,一个程序看不懂

qq_41059524 2017-11-15 07:49:38
一个霍夫曼编码程序,由于C语言基础不好,不知道运行后该怎么输入参数,求大神指教,谢谢啦

# include "stdio.h"
# include "stdlib.h"
# include "string.h"
# include "math.h"
# define DELTA 1.0e-6

void sort(double * ,char** ,int * ,int);
void code(double * ,char** ,int * ,int);

int
main(void)
{
float *p_i,*p;
float sum;
float temp;
char **c;
int *idx;
int q;
int i;

fscanf( stdin,"%d",&q);
idx=(int*)calloc(q,sizeof(int));
p_i=(float*)calloc(q,sizeof(float));
p=(float*)calloc(q,sizeof(float));
c=(char**)calloc(q,sizeof(char*));

for(i=0;i<q;i++)
{
c[i]=(char*)calloc(1,sizeof(char));
c[i][0]='\0';
}

sum=0.0;
for(i=0;i<q;i++)
{
fscanf(stdin,"&f",&p[i]);
p_i[i]= p[i];
idx[i]= i;
sum+=p_i[i];
}

if(fabs(sum-1.0)>DELTA)
{
fprintf(stderr,"p_i error\n");
exit(-1);
}

code(p_i,c,idx,q);

for(i=0;i<q;i++)
{
fprintf(stdout,"%d %.6f %s\n",idx[i],p[idx[i]],c[idx[i]]);
}

for(i=q;i>0;--i)
{
free(c[i]);
}
free(c);
free(p);
free(p_i);
free(idx);
exit(0);
}

void sort(double*p,char **c,int *idx,int q)
{
int finish=0;
int i,j;
int l1,l2;
char *s;
float t;

while(i<q &&! finish)
{
finish= 1;
for(j=0;j<q-i;j++ )
{
if(p[j]<p[j+1])
{
t=p[j];
p[j]=p[j+1];
p[j+1]=t;
l1=idx[j];
idx[j]=idx[j+1];

idx[j+1]=l1;
l1=strlen(c[j]);
l2=strlen(c[j+1]);
s=(char*)calloc(l1+1,sizeof(char));
strcpy(s,c[j]);
realloc(c[j],l2+1);
strcpy(c[j],c[j+1]);
realloc(c[j+1],l1+1);
strcpy(c[j+1],s);
free(s);
}
}
i++;
}
}

void code(double *p ,char **c ,int *idx ,int q)
{
int l1,l2;
char *s;
if(q==2)
{
realloc(c[0],3);
realloc(c[1],3);
strcat(c[0],"0");
strcat(c[1],"1");
}
else
{
p[q-2]=p[q-1]+p[q-2];
sort(p,c,idx,q-1);
code(p,c,idx,q-1);
l1=strlen(c[q-2]);
l2=strlen(c[q-1]);
s=(char*)calloc(l1+2,sizeof(char*));
strcpy(s,c[q-2]);
realloc(c[q-2],l1+2);
strcat(c[q-2],"0");
realloc(c[q-1],l2+2);
strcat(s,"1");
strcpy(c[q-1],s);
free(s) ;
}
}
...全文
123 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_41059524 2017-11-15
  • 打赏
  • 举报
回复
好的,谢谢啦
ooolinux 2017-11-15
  • 打赏
  • 举报
回复
可以百度了解一下 stdin 、 stdout 、stderr 以及输入输出重定向。
ooolinux 2017-11-15
  • 打赏
  • 举报
回复
fscanf( stdin,"%d",&q); 就是从控制台输入,也可以在命令行输入: 程序名[.exe] < input.txt 重定向到文件输入,方便多次运行,输入的数据事先存在input.txt [.exe] 部分可以不输 命令行执行程序如果不懂再回

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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