上機實驗(02次)

代碼

sorry,之前寫的有bug。現(xiàn)在的已經(jīng)完全沒有bug了扰法。

#include <stdio.h>
#include <stdlib.h>

#define MIN 32767
#define MAX 500

typedef struct
{
    char data;
    double weight;
    int parent;
    int lchild;
    int rchild;
} HTNode;

typedef struct
{
    char cd[MAX];
    int start;
} HCode;

void Display0(int count[]);                                  //統(tǒng)計各個字符出現(xiàn)次數(shù)
void Display1(HTNode ht[], HCode hcd[], int n0, char str[]); //顯示各個字符的哈夫曼編碼并輸出電文
void Display2(HTNode ht[], int n0, char str[]);              //輸入電文解碼輸出字符串
void BuildHTArray(HTNode ht[], int count[]);                 //填充ht[]數(shù)組的前n0項的data域和weight域
void CreateHT(HTNode ht[], int n0);                          //構(gòu)造哈夫曼樹
void CreateHCode(HTNode ht[], HCode hcd[], int n0);          //求哈夫曼編碼

void Display0(int count[])
{
    printf("Character\tfrequency\n");
    for (int i = 0; i < 127; i++)
    {
        if (count[i] != 0)
        {
            printf("%c:\t%d\n", i, count[i]);
        }
    }
}

void Display1(HTNode ht[], HCode hcd[], int n0, char str[])
{
    printf("character\tHuffmanCode\n");
    for (int i = 0; i < n0; i++)
    {
        printf("%c:\t", ht[i].data);
        for (int j = hcd[i].start; j <= n0; j++)
        {
            printf("%c", hcd[i].cd[j]);
        }
        printf("\n");
    }
    printf("\nThe HCode of this str is: ");
    while (*str != '\0')
    {
        for (int i = 0; i < n0; i++)
        {
            if (ht[i].data == *str)
            {
                for (int k = hcd[i].start; k <= n0; k++ )
                {
                    printf("%c", hcd[i].cd[k]);
                }
                break;
            }
        }
        str++;
    }
    printf("\n");
}

void Display2(HTNode ht[], int n0, char str[])
{
    int i = 0, j = 2 * n0 - 2, prej;
    printf("The str of this HCode is: ");
    while (str[i] != '\0')
    {
        while (j != -1)
        {
            prej = j;
            if (str[i] == '0')
            {
                j = ht[j].lchild;
            }
            else
            {
                j = ht[j].rchild;
            }
            i++;
        }
        printf("%c", ht[prej].data);
        i--;
        j = 2 * n0 - 2;
    }
    printf("\n");
}

void BuildHTArray(HTNode ht[], int count[])
{
    int j = 0;
    for (int i = 0; i < 127; i++)
    {
        if (count[i] != 0)
        {
            ht[j].data = i;
            ht[j].weight = count[i];
            j++;
        }
    }
}

void CreateHT(HTNode ht[], int n0)
{
    int i, k, lNode, rNode;
    double min1, min2;
    for (i = 0; i < 2 * n0 - 1; i++)
    {
        ht[i].lchild = ht[i].parent = ht[i].rchild = -1;
    }
    for (i = n0; i <= 2 * n0 - 2; i++)
    {
        min1 = min2 = MIN;
        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[i].weight = ht[lNode].weight + ht[rNode].weight;
        ht[i].lchild = lNode;
        ht[i].rchild = rNode;
        ht[lNode].parent = i;
        ht[rNode].parent = i;
    }
}

void CreateHCode(HTNode ht[], HCode hcd[], int n0)
{
    int i, parent, child;
    HCode hc;
    for (i = 0; i < n0; i++)
    {
        hc.start = n0;
        parent = ht[i].parent;
        child = i;
        while (parent != -1)
        {
            if (ht[parent].lchild == child)
            {
                hc.cd[hc.start--] = '0';
            }
            else
            {
                hc.cd[hc.start--] = '1';
            }
            child = parent;
            parent = ht[child].parent;
        }
        hc.start++;
        hcd[i] = hc;
    }
}

int main(void)
{
    FILE *fp;
    char ch, str[MAX + 1];
    int count[127] = {0}, n0 = 0, i = 0;
    fp = fopen("text.txt", "r");
    if (fp)
    {
        while (fscanf(fp, "%c", &ch) != EOF)
        {

            if (count[ch] == 0)
            {
                n0++;
            }
            count[ch]++;
            str[i++] = ch;
        }
        str[i] = '\0';
    }
    fclose(fp);
    HTNode *pHT = (HTNode *)malloc((2 * n0 - 1) * sizeof(HTNode));
    HCode *pHCD = (HCode *)malloc((2 * n0 - 1) * sizeof(HCode));
    if(pHT==NULL||pHCD==NULL){
        return 1;
    }
    Display0(count);
    printf("\n\n");
    BuildHTArray(pHT, count);
    CreateHT(pHT, n0);
    CreateHCode(pHT, pHCD, n0);
    Display1(pHT, pHCD, n0, str);
    printf("\nPlease enter a string of Huffman code: ");
    gets(str);
    Display2(pHT, n0, str);
    getchar();
    getchar();
    return 0;
}

text.txt

renshengruozhiruchujian

運行結(jié)果

運行結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酷窥,更是在濱河造成了極大的恐慌,老刑警劉巖蓬推,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澡腾,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛋铆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門刺啦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玛瘸,你說我怎么就攤上這事『ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵渺绒,是天一觀的道長。 經(jīng)常有香客問我宗兼,道長,這世上最難降的妖魔是什么殷绍? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮主到,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘登钥。我一直安慰自己畔师,他們只是感情好茉唉,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著度陆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懂傀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天蹬蚁,我揣著相機與錄音,去河邊找鬼犀斋。 笑死,一個胖子當(dāng)著我的面吹牛叽粹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播却舀,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辆脸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起螃诅,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎空执,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穗椅,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年门坷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袍镀。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绸吸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤攘轩,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站度帮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笨篷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一率翅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧袖迎,春花似錦、人聲如沸瓢棒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至连霉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跺撼,已是汗流浹背窟感。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工柿祈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躏嚎。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像卢佣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子箭阶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容