哈夫曼码结构体的疑问
问题出现在哈夫曼码那个函数里 当结构体定义函数指针时而且输入的参数也是另一个结构体 这里要怎么做?其他函数都能运行 就这里不会#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//
struct codage{ //编码的结构体里有一个字母和一个字母出现的频率
char symbole;
int freq;
};
typedef struct codage codage;
//
struct noeud{ //树的结构体有字符串,左枝点 右枝点 父枝点
char symbole;
struct noeud *fils_g; //左枝点
struct noeud *fils_d; //右枝点
struct noeud *pere; //父枝点
};
typedef struct noeud noeud;
void frequence(int *freq,char *chaine) //此函数是为了找出字符串里每个ASCII字符的频率
{
char car;
int i;
int length;
// 计算字符串的长度
length=strlen(chaine);
//建立一个表格 现在频率全是0
for(i=0;i<256;i++)
{
freq=0;
}
// 计算字符串里每个字母的频率
for(i=0;i<length;i++)
{
car=chaine;
freq++;
}
return;
}
voidtri_bulle(codage *tab_codage, int length) //排序函数
{
int u;
char s;
int i,j;
for(i=0;i<length;i++)
{
for(j=0;j<length-1;j++)
{
if( tab_codage.freq < tab_codage.freq )
{
// on permute tab_codage et tab_codage
// symbole
strcpy(s,tab_codage.symbole);
strcpy(tab_codage.symbole,tab_codage.symbole);
strcpy(tab_codage.symbole,s);
//freq
u=tab_codage.freq;
tab_codage.freq=tab_codage.freq;
tab_codage.freq=u;
}
}
}
return;
}
int init_tab_codage(codage *tab_codage,int *freq) //使用频率>0的字母填入表格里并且以降序排序
{
int nb=0,i,j,length;
//我们在tab_codage这个列表中插入每个频率大于0的字符
j=0;
for(i=0;i<256;i++)
{
if(freq > 0)
{
tab_codage.freq=freq;
tab_codage.symbole=(char)i;
tab_codage.symbole='\0';
j++;
}
}
length=j;
// on affiche le contenu de tab_codage
for(i=0;i<length;i++)
{
printf("caractère \"%s\", freq=%d\n",tab_codage.symbole,tab_codage.freq);
}
// 进行表格排序
tri_bulle(tab_codage, length);
// 显示已经排好序的表格
for(i=0;i<length;i++)
{
printf("caractère \"%s\", freq=%d\n",tab_codage.symbole,tab_codage.freq);
}
return(length);
}
noeud *trouve_noeud(noeud *racine,char *symbole) //这个函数, 用于搜索包含符号树的叶
{
noeud *t;
t=racine;
int compteur=0;
while( (t != NULL) )
{
if( strcmp(t->symbole,symbole) == 0)
{
return(t);
}
else if( (t->fils_g != NULL ) && ( strstr((t->fils_g)->symbole,symbole) != NULL) )
{
t=t->fils_g;
}
else if( (t->fils_d != NULL ) && ( strstr((t->fils_d)->symbole,symbole) != NULL) )
{
t=t->fils_d;
}
else
return(NULL);
}
}
noeud *huffman_code(codage *source,int N) //这里弄不太懂这个是结构体定义函数指针 还有输入的参数也是另一个结构体
{
codage *t;
t=source;
int i;
int a;
if (t.symbole !=NULL)
{
if(t.fils_g==NULL&&t.fils_d==NULL)
{
int i;
for(i=0;i<N;i++)
printf("%s",t);
printf("\n");
}
else
{
a=0;
huffman_code(t.fils_g,N+1);
a=1;
huffman_code(t.fils_d,N+1);
}
}
}
int main()
{
char *chaine="aaababaaababbbbbbbbbbbbabcddddbcaaabbbbbbbbbbbabbaa";
int freq;
codage source;
int length;
noeud *racine;
frequence(freq,chaine);
length=init_tab_codage(source,freq);
racine=huffman_code(source,length);
return(EXIT_SUCCESS);
} 求大神解疑 那个是指针函数吧 改成void类型,试试 lovefishc.com 发表于 2019-2-17 04:12
改成void类型,试试
是啊书上的题要求用指针函数 不能用void 有没有大佬帮帮忙啊? qpwoeiruyt 发表于 2019-2-17 15:39
是啊书上的题要求用指针函数 不能用void
{:10_245:}那返回地址不就行了吗。 这个写的是哈夫曼编码,最后打印出来? 这个是题的答案吗? qpwoeiruyt 发表于 2019-2-18 16:14
有没有大佬帮帮忙啊?
在函数最后加上
return t;
试一下 这个函数用的是递归,是这里不懂吗? lovefishc.com 发表于 2019-2-18 14:42
这个写的是哈夫曼编码,最后打印出来?
对 这个要打印哈夫曼码这个不是答案老师说只需要更改noeud *huffman_code(codage *source,int N)这个函数里面的东西让它运行起来 其他函数不须改变都可运行,上面huffman_code 里是我写的 但是应该错了 我不太懂指针函数这方面 求大神改改我的huffman—code那里 使最后能打印出哈夫曼码 这个怕不是很好改,错误很多啊。 mqcake 发表于 2019-2-19 08:04
这个怕不是很好改,错误很多啊。
就是把我的noeud *huffman_code(codage *source,int N)里面的东西改了就好 其他都OK的 求大神帮帮忙 qpwoeiruyt 发表于 2019-2-19 21:50
求大神帮帮忙
1.如果可以,你需要再补充一些问题,我总感觉哪里没有弄明白
2.这个程序要输出什么内容才是正确的?
最重要的是第2点,我需要第2点来反向理解第1点,如果你能补充一些的话会更好
人造人 发表于 2019-2-19 15:31
1.如果可以,你需要再补充一些问题,我总感觉哪里没有弄明白
2.这个程序要输出什么内容才是正确的?
就是输出哈夫曼码 比如输入aaacccbbb 这个字符串然后打印出各个字母的哈夫曼码a=001 b=01 这样子 qpwoeiruyt 发表于 2019-2-20 00:25
就是输出哈夫曼码 比如输入aaacccbbb 这个字符串然后打印出各个字母的哈夫曼码a=001 b=01 这样子
首先,你先确认一下这个代码
也就是说现在这个代码就差huffman_code函数了,其他部分都没问题,是这样吧
然后,完成了huffman_code函数后,这个程序应该输出什么内容才是正确的
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//
struct codage{ //编码的结构体里有一个字母和一个字母出现的频率
char symbole;
int freq;
};
typedef struct codage codage;
//
struct noeud{ //树的结构体有字符串,左枝点 右枝点 父枝点
char symbole;
struct noeud *fils_g; //左枝点
struct noeud *fils_d; //右枝点
struct noeud *pere; //父枝点
};
typedef struct noeud noeud;
void frequence(int *freq, char *chaine) //此函数是为了找出字符串里每个ASCII字符的频率
{
char car;
int i;
int length;
// 计算字符串的长度
length = strlen(chaine);
//建立一个表格 现在频率全是0
for(i = 0; i < 256; i++)
{
freq = 0;
}
// 计算字符串里每个字母的频率
for(i = 0; i < length; i++)
{
car = chaine;
freq++;
}
return;
}
voidtri_bulle(codage *tab_codage, int length) //排序函数
{
int u;
char s;
int i, j;
for(i = 0; i < length; i++)
{
for(j = 0; j < length - 1; j++)
{
if(tab_codage.freq < tab_codage.freq)
{
// on permute tab_codage et tab_codage
// symbole
strcpy(s, tab_codage.symbole);
strcpy(tab_codage.symbole, tab_codage.symbole);
strcpy(tab_codage.symbole, s);
//freq
u = tab_codage.freq;
tab_codage.freq = tab_codage.freq;
tab_codage.freq = u;
}
}
}
return;
}
int init_tab_codage(codage *tab_codage, int *freq) //使用频率>0的字母填入表格里并且以降序排序
{
int nb = 0, i, j, length;
//我们在tab_codage这个列表中插入每个频率大于0的字符
j = 0;
for(i = 0; i < 256; i++)
{
if(freq > 0)
{
tab_codage.freq = freq;
tab_codage.symbole = (char)i;
tab_codage.symbole = '\0';
j++;
}
}
length = j;
// on affiche le contenu de tab_codage
for(i = 0; i < length; i++)
{
printf("caractère \"%s\", freq=%d\n", tab_codage.symbole, tab_codage.freq);
}
// 进行表格排序
tri_bulle(tab_codage, length);
// 显示已经排好序的表格
for(i = 0; i < length; i++)
{
printf("caractère \"%s\", freq=%d\n", tab_codage.symbole, tab_codage.freq);
}
return(length);
}
noeud *trouve_noeud(noeud *racine, char *symbole) //这个函数, 用于搜索包含符号树的叶
{
noeud *t;
t = racine;
int compteur = 0;
while((t != NULL))
{
if(strcmp(t->symbole, symbole) == 0)
{
return(t);
}
else if((t->fils_g != NULL) && (strstr((t->fils_g)->symbole, symbole) != NULL))
{
t = t->fils_g;
}
else if((t->fils_d != NULL) && (strstr((t->fils_d)->symbole, symbole) != NULL))
{
t = t->fils_d;
}
else
return(NULL);
}
}
noeud *huffman_code(codage *source, int N) //这里弄不太懂这个是结构体定义函数指针 还有输入的参数也是另一个结构体
{
}
int main()
{
char *chaine = "aaababaaababbbbbbbbbbbbabcddddbcaaabbbbbbbbbbbabbaa";
int freq;
codage source;
int length;
noeud *racine;
frequence(freq, chaine);
length = init_tab_codage(source, freq);
racine = huffman_code(source, length);
return(EXIT_SUCCESS);
}
人造人 发表于 2019-2-19 17:34
首先,你先确认一下这个代码
也就是说现在这个代码就差huffman_code函数了,其他部分都没问题,是这样吧 ...
是的 其他都是正确的 就差noeud *huffman_code(codage *source, int N)
最后完成后是能打印出哈夫曼码出来例如a=001 这样 qpwoeiruyt 发表于 2019-2-20 01:04
是的 其他都是正确的 就差noeud *huffman_code(codage *source, int N)
最后完成后是能打印出哈夫曼码 ...
我还是没有问到我需要的内容,我举个例子
下面这个程序
#include <stdio.h>
int main(void)
{
for(int i = 0; i < 10; ++i)
printf("%d\n", i);
return 0;
}
输出
0
1
2
3
4
5
6
7
8
9
请按任意键继续. . .
对于你的这个程序,如果完成了huffman_code函数,输出是什么样的?
页:
[1]
2