亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 哈夫曼.c

?? 數據結構的全部課程實驗
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include<stdio.h>
#include<malloc.h>
#include<math.h>
#define NULL 0

typedef struct huff_code_node    //存儲編碼的鏈表
{
    char ch;    //編碼對應的字符
    char code[100];        //字符對應的哈夫曼碼
    struct huff_code_node *next;    
}hnode,*huff;

typedef struct tree_Node    //二叉樹結點
{
    char ch;    //字符內容
    int amount;    //字符在字符串中出現的次數
    struct tree_Node *left,*right;    //指向左子樹與右子樹
}tnode,*bt;

typedef struct list_node        //鏈表結點
{
    char ch;    //存儲字符串中的字符
    int amount;    //字符在字符串中出現的次數
    tnode *son;    //鏈表結點帶有二叉子樹的根結點指針
    struct list_node *next;    //指向鏈表中下一個結點
}Node,*L;

typedef struct stack_node
{
    char ch;    //存儲字符
    int amount;        //出現次數
    bt son;        //指向二叉樹的某結點
    struct stack_node *next;
}snode,*stack;


char t[200],*str,*c;    //用于存儲和處理輸入的字符串
bt root=NULL;        //哈夫曼樹
L l,p,q,new_node;    //鏈表結點
huff hlist;        //計算得到的編碼表
int char_num;    //輸入的不同字符數量
int char_amount;    //輸入的所有字符數量
int code_sum;        //哈夫曼編碼總長


void initial()        //初始化操作
{
    l=(Node*)malloc(sizeof(Node));        //建立空鏈表
    l->ch='\0';
    l->amount=0;
    l->son=NULL;
    l->next=NULL;

    str=t;    //將字符串指針指向字符串的第一個位置
    //鍵盤輸入字符串
    printf("輸入字符串進行哈夫曼編碼:\n");
    scanf("%s",str);
    getchar();    
}

void pull_in_list()
{
    int exist;    //表示當前字符是否存在于鏈表中,0為不存在,1為已存在
    int n;    //計算輸入不同字符的數量,計算后賦值給全局變量char_num
    int m;    //計算輸入所有字符的數量,計算后賦值給全局變量char_amount
    
    c=str;    //c指向第一個字符
    
    while(*c!='\0')        //若字符串未讀完
    {
        exist=0;
        p=l;    //p指向鏈表頭結點
        //尋找該字符是否已經在鏈表中
        while(p->next!=NULL)    //若鏈表非空
        {
            p=p->next;
            if(p->ch==*c)    //若當前字符已經在鏈表中
            {
                exist=1;
                p->amount++;    //字符出現次數加1
                break;
            }
        }

        if(exist==0)    //若當前字符不存在于鏈表中,則分配一個結點入表
        {
            new_node=(Node*)malloc(sizeof(Node));
            new_node->ch=*c;
            new_node->amount=1;
            new_node->next=NULL;
            new_node->son=NULL;
            p->next=new_node;
            p=new_node;
        }
        c++;    //讀下一個字符
    }

    printf("統計結果:\n");
    p=l;
    n=0;
    m=0;
    while(p->next!=NULL)
    {
        n++;
        p=p->next;
        m+=p->amount;
        printf("%c--%d\n",p->ch,p->amount);
    }
    char_num=n;
    char_amount=m;
    printf("一共有%d種字符輸入,字符總數%d\n",char_num,char_amount);
}

int list_element_amount()        //計算鏈表中結點的數量(不包括頭結點)
{
    L temp;        //定義臨時指針
    int n=0;        //結點數量
    temp=l;
    while(temp->next!=NULL)    //后面還有結點
    {
        n++;
        temp=temp->next;
    }
    return n;
}

bt create()    //建立最優二叉樹
{
    //=========================================
    //這些變量用于尋找最小結點
    L min1_pos,min2_pos,t,min_pri;
    bt min1_son,min2_son;
    int min1,min2;
    char min1_c,min2_c;
    //=========================================

    //=========================================
    //這些變量用于構造二叉子樹
    bt left,right,root;
    //==========================================

    //==========================================
    //這些變量用于將二叉子樹信息插入鏈表
    L made,temp_p;
    //============================================

    while(list_element_amount()>=2)    //若表中還有兩個或以上結點,則歸并繼續
    {
        //選擇次數值最小的兩個結點

        //============================================================================
        //先尋找第一個小結點
        t=l->next;
        min1=t->amount;        //將第一個結點的次數值賦給min1
        min1_pos=t;            //將第一個結點的位置指針賦給min1_pos
        min1_c=t->ch;        //將第一個結點的字符賦值給min1_c
        min1_son=t->son;    //將第一個結點的二叉指針賦值給min1_son
        min_pri=l;            //min_pri始終指向最小結點的前驅,以方便刪除最小結點

        while(t->next!=NULL)
        {
            t=t->next;
            if(min1>t->amount)    //發現更小的結點
            {
                min1=t->amount;        //將當前結點的次數值賦給min1
                min1_pos=t;            //將當前結點的位置指針賦給min1_pos
                min1_c=t->ch;        //將當前結點的字符賦值給min1_c
                min1_son=t->son;    //將當前結點的二叉指針賦值給min1_son
            }
        }//退出本循環時,最小結點的信息找出,將該結點刪除

        min_pri=l;
        while(min_pri->next!=min1_pos)
            min_pri=min_pri->next;
        //退出循環時min_pri指向min1_pos的前驅
        min_pri->next=min1_pos->next;        //刪除結點min1_pos
        //尋找第一個小結點完成
        //=================================================================

        //=================================================================
        //先尋找第二個小結點
        t=l->next;
        min2=t->amount;        //將第二個結點的次數值賦給min2
        min2_pos=t;            //將第二個結點的位置指針賦給min2_pos
        min2_c=t->ch;
        min2_son=t->son;
        min_pri=l;        //min_pri始終指向最小結點的前驅,以方便刪除最小結點

        while(t->next!=NULL)
        {
            t=t->next;
            if(min2>t->amount)    //發現更小的結點
            {
                min2=t->amount;        //將當前結點的次數值賦給min2
                min2_pos=t;            //將當前結點的位置指針賦給min2_pos
                min2_c=t->ch;
                min2_son=t->son;
            }
        }//退出本循環時,最小結點的信息找出,將該結點刪除

        min_pri=l;
        while(min_pri->next!=min2_pos)
            min_pri=min_pri->next;
        //退出循環時min_pri指向min1_pos的前驅
        min_pri->next=min2_pos->next;        //刪除結點min2_pos
        //尋找第二個小結點完成
        //=================================================================


        //==================================================================
        //兩個最小結點找到,由這對結點級成一個二叉子樹,將根結點插入鏈表中
        if(min1_son==NULL)    //該結點無二叉子樹指針,則須新分配一個二叉樹結點
        {
            left=(bt)malloc(sizeof(tnode));        //產生左孩子
            left->amount=min1;        //次數值復制
            left->ch=min1_c;        //字符復制
            left->left=NULL;
            left->right=NULL;
        }
        else    //該結點為計算產生的結點,它已指向一個二叉子樹
            left=min1_son;    //left直接指向已經生成的二叉子樹的根結點

        if(min2_son==NULL)    //該結點無二叉子樹指針,則須新分配一個二叉樹結點
        {
            right=(bt)malloc(sizeof(tnode));        //產生右孩子
            right->amount=min2;        //次數值復制
            right->ch=min2_c;        //字符復制
            right->left=NULL;
            right->right=NULL;
        }
        else
            right=min2_son;    //left直接指向已經生成的二叉子樹的根結點

        root=(bt)malloc(sizeof(tnode));
        root->amount=min1+min2;
        root->ch='\0';        //對于計算產生的樹結點,字符均為空
        root->left=left;
        root->right=right;
        //二叉子樹完成

        //生成一個對應上面已產生二叉子樹地址的鏈表結點
        made=(L)malloc(sizeof(Node));
        made->amount=root->amount;
        made->ch=root->ch;
        made->next=NULL;
        made->son=root;

        //將生成的鏈表結點插入鏈表中
        temp_p=l;
        while(temp_p->next!=NULL)
            temp_p=temp_p->next;
        //退出循環時temp_p指向鏈表最后一個結點
        temp_p->next=made;        //將生成的結點插入鏈表
    }

    temp_p=l->next;
    return temp_p->son;
}

void encoding()        //根據建立的哈夫曼樹編碼
{
    stack code,top,temp,readcode;
    bt r;
    huff temp_huff,hp;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品欧美一区二区三区综合在| 亚洲高清一区二区三区| 欧美性大战久久久久久久| 成人99免费视频| 成人性生交大片免费看在线播放| 国内精品免费**视频| 精品在线你懂的| 久久99久久99小草精品免视看| 日本在线观看不卡视频| 日韩va欧美va亚洲va久久| 日韩av高清在线观看| 欧美a一区二区| 美国十次了思思久久精品导航| 五月激情六月综合| 蜜桃视频在线观看一区二区| 日韩vs国产vs欧美| 国产精品1区2区3区在线观看| 韩国精品免费视频| 成人午夜免费视频| 一区二区三区在线看| 国产精品美女久久久久aⅴ国产馆| 欧美一级久久久| 久久精品人人做| 最好看的中文字幕久久| 亚洲一本大道在线| 狠狠色综合日日| 9色porny自拍视频一区二区| 91麻豆精品在线观看| 欧美裸体一区二区三区| 欧美精品一区二区三区很污很色的| 久久免费的精品国产v∧| 亚洲人成亚洲人成在线观看图片 | 国产精品天天摸av网| 国产婷婷一区二区| 亚洲精品伦理在线| 青青草国产精品97视觉盛宴| 国产99精品国产| 日本二三区不卡| 精品国产一区二区三区四区四| 国产日韩一级二级三级| 亚洲成人av资源| 成人免费高清在线| 欧美美女视频在线观看| 中文字幕一区二区三区在线不卡| 一区二区久久久| 国产成人精品三级| 日韩精品中午字幕| 亚洲人成网站色在线观看| 国内精品不卡在线| 欧美调教femdomvk| 国产精品日韩成人| 久久精品国产免费看久久精品| 色综合中文字幕| 日韩一区二区电影在线| 亚洲视频一区二区在线| 国产一区二区三区久久悠悠色av| 91精彩视频在线| 中文字幕一区二区三区在线不卡 | 成人国产一区二区三区精品| 欧美日韩亚洲综合在线| 中文字幕一区二区三中文字幕| 日本成人在线一区| 欧美视频一区二区| 亚洲综合一区在线| 成人免费av网站| 久久精品日韩一区二区三区| 美女网站一区二区| 欧美一二三区在线| 日韩高清欧美激情| 欧美久久久久久久久| 亚洲午夜久久久久久久久久久| 成人午夜碰碰视频| 国产精品区一区二区三区| 国产精品一二三四区| 欧美mv日韩mv国产网站app| 亚瑟在线精品视频| 欧美三级电影在线观看| 亚洲一级电影视频| 欧美日韩一区高清| 免费观看30秒视频久久| 91麻豆精品91久久久久久清纯| 亚洲第一会所有码转帖| 欧美日本一区二区| 美女一区二区在线观看| 精品国产在天天线2019| 国产在线一区观看| 国产亚洲精品aa午夜观看| 国产精品系列在线播放| 久久精品亚洲精品国产欧美| 国产真实乱子伦精品视频| 国产欧美精品一区二区色综合朱莉| 成人国产亚洲欧美成人综合网| 中文字幕一区二区三区精华液| 成人中文字幕电影| 亚洲狼人国产精品| 欧美日本一区二区在线观看| 久久草av在线| 中文字幕 久热精品 视频在线| 95精品视频在线| 婷婷成人激情在线网| 日韩美女天天操| 99久久伊人精品| 日韩电影在线观看网站| 国产午夜亚洲精品理论片色戒| 99精品视频免费在线观看| 亚洲大尺度视频在线观看| 欧美一区二区三区白人| 国产成人av一区二区三区在线| 中文字幕在线免费不卡| 成人av电影免费观看| 欧美日本国产视频| 亚洲另类一区二区| 韩国v欧美v日本v亚洲v| 久久亚洲一区二区三区明星换脸| 国产91在线|亚洲| 亚洲精品水蜜桃| 精品人在线二区三区| 91美女片黄在线观看91美女| 免费一级片91| 亚洲综合在线电影| 2023国产一二三区日本精品2022| 精品日韩一区二区三区免费视频| 国产成a人亚洲精| 亚洲成人一二三| 亚洲视频一区二区在线观看| 久久亚洲私人国产精品va媚药| 91福利国产成人精品照片| 国产在线一区观看| 日韩精品亚洲专区| 亚洲黄色在线视频| 国产精品视频免费| 日韩精品专区在线影院观看| 亚洲一区二区视频在线观看| 色94色欧美sute亚洲线路一久 | 久久久久久综合| 午夜电影网一区| 国产精品美女久久久久高潮| 麻豆国产精品777777在线| 亚洲欧洲精品一区二区三区| 欧美高清视频www夜色资源网| 成人一二三区视频| 丁香六月久久综合狠狠色| 久久精品国产亚洲一区二区三区 | 亚洲高清免费在线| 国产精品成人在线观看| 国产精品女主播在线观看| 欧美精品一区二区三区久久久| 3atv一区二区三区| 欧美日本在线播放| 欧美色视频一区| 欧美又粗又大又爽| 亚洲视频小说图片| 欧美日韩你懂的| 国产精品18久久久久久久网站| 午夜欧美视频在线观看| 亚洲一区二区三区视频在线 | 色天天综合色天天久久| 99精品视频在线观看免费| 波波电影院一区二区三区| 成人自拍视频在线| 99久久国产综合色|国产精品| 99re8在线精品视频免费播放| 成人午夜精品在线| 91玉足脚交白嫩脚丫在线播放| 99久久精品情趣| 日本道色综合久久| 欧美区在线观看| 欧美一二三四在线| 国产亚洲午夜高清国产拍精品 | 在线观看国产日韩| 在线观看日韩高清av| 在线观看91视频| 欧美一区二区视频网站| 精品国产区一区| 国产精品看片你懂得| 亚洲精品国产无套在线观| 亚洲大型综合色站| 国产精品乡下勾搭老头1| 99re热这里只有精品免费视频| 色一情一乱一乱一91av| 欧美一区二区在线视频| 久久伊人中文字幕| 亚洲卡通欧美制服中文| 亚洲成人免费av| 国产精品一区二区在线观看网站| 波多野结衣亚洲| 欧美精品乱码久久久久久按摩| 精品国产乱码久久久久久影片| 欧美国产欧美亚州国产日韩mv天天看完整 | 日韩精品一区二区三区swag| 久久久久久99久久久精品网站| 国产精品看片你懂得| 热久久免费视频| 成人动漫av在线| 在线成人av网站| 国产精品欧美一级免费| 亚洲不卡av一区二区三区| 国产成人在线影院 | 日韩视频在线一区二区| 国产精品盗摄一区二区三区|