#include<stdio.h>
#include<string.h>
#define N 50
#define M 2*N-1
typedef struct{
char data[5];
int weight;
int parent;
int lchild;
int rchild;
} htnode;
typedef struct hcode{
char cd[N];
int start;
} hcode;
void createht(htnode ht[],int n){
int i,k,lnode,rnode;
int min1,min2;
for(i=0;i<2*n-1;i++) ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
for(i=n;i<2*n-1;i++){
min1=min2=32767;
lnode=rnode=-1;
for(k=0;k<=i-1;k++){
if(ht[k].parent==-1){
if(ht[k].weight<min1){
min2=min1;
rnode=lnode;
min1=ht[k].weight;
lnode=k;
}
else if(ht[k].weight<min2){
min2=ht[k].weight;
rnode=k;
}
}
ht[lnode].parent=i;
ht[rnode].parent=i;
ht[i].weight=ht[lnode].weight+ht[rnode].weight;
ht[i].lchild=lnode;
ht[i].rchild=rnode;
}
}
void createhcode(htnode ht[],hcode hcd[],int n){
int i,f,c;
hcode hc;
for(i=0;i<n;i++){
hc.start=n;
c=i;
f=ht[i].parent;
while(f!=-1){
if(ht[f].lchild==c) hc.cd[hc.start--]='0';
else hc.cd[hc.start--]='1';
c=f;
f=ht[f].parent;
}
hc.start++;
hcd[i]=hc;
}
}
void disphcode(htnode *ht,hcode *hcd,int n){
int i,k;
int sum=0,m=0,j;
printf("输出哈夫曼编码:\n");
for(i=0;i<n;i++){
j=0;
printf("%s:\t",ht[i].data);
for(k=hcd[i].start;k<=n;k++){
printf("%c",hcd[i].cd[k]);
j++;
}
m+=ht[i].weight;
sum+=ht[i].weight*j;
printf("\n");
}
printf("\n平均长度=%g\n",1.0*sum/m);
}
void main(){
int n=15,i;
char *str[]={"the","of","a","to","and"."in","that","he","is","at","on","for","his","are","be"};
int fnum[]={1192,677,541,518,462,450,242,195,190,181,174,157,138,124,123};
htnode ht[M];
hcode hcd[N];
for(i=0;i<n;i++){
strcpy(ht[i].data,str[i]);
ht[i].weight=fnum[i];
}
printf("\n");
createht(ht,n);
createhcode(ht,hcd,n);
disphcode(ht,hcd,n);
printf("\n");
}
结果是不对,有什么修正的方法么
追答我不知道你是怎么构造哈弗曼树的,这个需要自己调,调试的过程也会收获很多的,网上有很多类似的例子,可以借鉴一下,比较一下优劣
大佬帮忙看看这个程序错在哪了,刚学C语言?
修改如下:int main(){int price=0; \/\/该处由‘,’改为‘;’printf("请输入金额(元) :") ;\/\/该处缺少分号scanf("%d",&price);int change=100-price;printf("找您%d元。\\n",change);return 0;} 运行结果如下:
一道c语言编程题求大神解答,找一下我错在哪了,谢谢了?
错误1:宏定义最后没有分号,将#define D 500;改为#define D 500 错误2:l不是整数,因此将l定义为int型就错了 错误3:既然规定输入格式为P=,那么输入时就不能直接输入数值,而应在数值之前输入P=,例如输入P=6000 另外,程序的不妥之处:1、利润不一定是整数,因此将P定义为int型不妥 2、i...
各位C语言高手教教我 我这程序错在哪里
int main(){ int a,b,c;scanf("%d,%d,%d",&a,&b,&c);if (a+b>c&&a+c>b&&b+c>a){ if(a==b&&b==c) printf("dbsjx");else if(a==b||a==c||b==c) printf("dysjx");else if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) printf("zjsjx");els...
关于C语言编写程序的一个疑问 高手帮忙看看我的程序哪错了
首先,你的代码不完整。第9、11、13行要定义三个100行的二维字符数组,如果仅仅是类似char adj[100][12]={"开心的"}的定义;这样adj[1]到adj[99]这99个词都会是空值(ASCII码为0),若用printf()函数把这个范围内的某个字符数组打印,将会什么都看不到。所以,你记得要把这总共300个词补全。...
C语言!帮忙看下我写的这个程序错在哪里了,谢谢!用的是二次插值法._百...
其他的地方没有错,area函数定义的变量p的地方有错:include "stdio.h"include "math.h"include "conio.h"void main(){ float *area(float a1,float p,float a[3]);float f(float x);float ar,fr;float a2,a3;float f1,f2,f3;float a1=10,p=0.01,e=0.00001;float pa[3];area(a1...
C语言开关灯问题,麻烦大神们帮我看看这个程序哪里错了啊,结果不对...
应该改为:int a[6000];for(i=0;i<6000;i++)a[i]=1;2、第二层循环里:if(a[j]==0)a[j]=1;if(a[j]==1)a[j]=0;这个语句把所有的灯都关闭了,因为如果关了,就打开;打开后又关了。逻辑不对,改成:if(a[j]==0)a[j]=1;else a[j]=0;这样就没问题了。
c语言 帮我看一下哪里错了 我第一次编写啊, 谢啦
我没看结果对不对,首先编译不过去的原因有,前后变量名不一致,函数名打错,引号的全角和半角打错,总之全部是粗心犯的错。int main (void){ \/\/把三个系数保存到计算机中 int a = 1; \/\/不表示相等, 表示赋值 int b = 2;int c = 3;double delt; \/\/delt 存放的是 b*b - 4*a*c d...
c语言:如图,请问一下哪里出错了?
首先解答一下这个C语言代码出错的原因:第一个gets未定义:出现这个错误一般是没有包含相应的头文件,或者库里没有这个函数。这里应该是没有这个函数。gets(char *dest)是一个老的库函数,采用这个函数存在越界的安全隐患。它只有一个参数,如果输入的字符个数超过dest内存空间,程序可能失败,也可能被黑客...
c语言程序运行,结果都是0.0000000,谁能告诉我这个程序错在哪里啊
有的编译系统double型数据只能用%lf,你改一下就行了 include<stdio.h> include<math.h> main(){double i=0,s=0,n;printf("请输入最后一项的分母 n=");scanf("%lf",&n);n=(n-1)\/2;while(i<=n){s=s+pow(-1,i)\/(2*i+1);i++;} printf("%.9lf\\n",s);} ...
C语言数组编程 帮我看看哪里错了
这是在你的基础上改写程序:include <iostream>\/\/cout的头文件是"iostream"include <stdio.h>\/\/scanf的头文件是"stdio.h"using namespace std;void main(){ int i,max,min,pos_max,pos_min,a[10];cout<<"请输入十个元素:"<<endl;for(i=0;i<10;i++)\/\/输入数组a的元素 scanf("%d",...