qpwoeiruyt 发表于 2019-2-17 00:29:26

哈夫曼码结构体的疑问

问题出现在哈夫曼码那个函数里 当结构体定义函数指针时而且输入的参数也是另一个结构体 这里要怎么做?其他函数都能运行 就这里不会





#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);
}

qpwoeiruyt 发表于 2019-2-17 02:17:53

求大神解疑

lovefishc.com 发表于 2019-2-17 11:05:36

那个是指针函数吧

lovefishc.com 发表于 2019-2-17 11:12:13

改成void类型,试试

qpwoeiruyt 发表于 2019-2-17 15:39:27

lovefishc.com 发表于 2019-2-17 04:12
改成void类型,试试

是啊书上的题要求用指针函数 不能用void

qpwoeiruyt 发表于 2019-2-18 16:14:24

有没有大佬帮帮忙啊?

lovefishc.com 发表于 2019-2-18 21:40:58

qpwoeiruyt 发表于 2019-2-17 15:39
是啊书上的题要求用指针函数 不能用void

{:10_245:}那返回地址不就行了吗。

lovefishc.com 发表于 2019-2-18 21:42:37

这个写的是哈夫曼编码,最后打印出来?

lovefishc.com 发表于 2019-2-18 21:43:31

这个是题的答案吗?

lovefishc.com 发表于 2019-2-18 21:45:49

qpwoeiruyt 发表于 2019-2-18 16:14
有没有大佬帮帮忙啊?

在函数最后加上
return t;
试一下

lovefishc.com 发表于 2019-2-18 22:08:18

这个函数用的是递归,是这里不懂吗?

qpwoeiruyt 发表于 2019-2-19 00:41:09

lovefishc.com 发表于 2019-2-18 14:42
这个写的是哈夫曼编码,最后打印出来?

对 这个要打印哈夫曼码这个不是答案老师说只需要更改noeud *huffman_code(codage *source,int N)这个函数里面的东西让它运行起来 其他函数不须改变都可运行,上面huffman_code 里是我写的 但是应该错了 我不太懂指针函数这方面 求大神改改我的huffman—code那里 使最后能打印出哈夫曼码

mqcake 发表于 2019-2-19 15:04:53

这个怕不是很好改,错误很多啊。

qpwoeiruyt 发表于 2019-2-19 15:19:40

mqcake 发表于 2019-2-19 08:04
这个怕不是很好改,错误很多啊。

就是把我的noeud *huffman_code(codage *source,int N)里面的东西改了就好 其他都OK的

qpwoeiruyt 发表于 2019-2-19 21:50:41

求大神帮帮忙

人造人 发表于 2019-2-19 22:31:22

qpwoeiruyt 发表于 2019-2-19 21:50
求大神帮帮忙

1.如果可以,你需要再补充一些问题,我总感觉哪里没有弄明白
2.这个程序要输出什么内容才是正确的?

最重要的是第2点,我需要第2点来反向理解第1点,如果你能补充一些的话会更好

qpwoeiruyt 发表于 2019-2-20 00:25:29

人造人 发表于 2019-2-19 15:31
1.如果可以,你需要再补充一些问题,我总感觉哪里没有弄明白
2.这个程序要输出什么内容才是正确的?



就是输出哈夫曼码    比如输入aaacccbbb 这个字符串然后打印出各个字母的哈夫曼码a=001 b=01 这样子

人造人 发表于 2019-2-20 00:34:29

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);
}

qpwoeiruyt 发表于 2019-2-20 01:04:18

人造人 发表于 2019-2-19 17:34
首先,你先确认一下这个代码
也就是说现在这个代码就差huffman_code函数了,其他部分都没问题,是这样吧 ...

是的 其他都是正确的 就差noeud *huffman_code(codage *source, int N)

最后完成后是能打印出哈夫曼码出来例如a=001 这样

人造人 发表于 2019-2-20 01:19:29

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
查看完整版本: 哈夫曼码结构体的疑问