• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            鍵盤上的舞者

            My Email: marckywu@gmail.com
            隨筆 - 19, 文章 - 0, 評論 - 3, 引用 - 0
            數據加載中……

            HuffmanTree的創建及編碼

            typedef struct _HTNode {
                unsigned 
            int weight;        /* 權值 */
                unsigned 
            int parent;        /* 父節點索引 */
                unsigned 
            int lchild;        /* 左孩子索引 */
                unsigned 
            int rchild;        /* 右孩子索引 */
            } HTNode, 
            *HuffmanTree;         /* 動態分配數組存儲哈夫曼樹 */

            typedef 
            char **HuffmanCode;     /* 動態分配數組存儲哈夫曼編碼表 */

            /* 從ht的1~n的節點中找出權值最小的兩個節點,分別存于s1, s2中 */
            void Select(HuffmanTree ht, int n, int *s1, int *s2)
            {
                
            int i;

                
            *s1 = 0;
                
            *s2 = 0;
                
            /*設置s1, s2到開始兩個parent等于0的節點位置*/
                
            for (i = 1; i <= n; ++i) {
                    
            if (*s1 != 0 && *s2 != 0)
                        
            break;
                   
                    
            if (ht[i].parent == 0)
                        
            *s1 == 0 ? *s1 = i : *s2 = i;
                }
                
            /*找出ht中parent等于0,且權值最小的兩個節點位置,分別存于s1, s2中*/
                
            for ( ; i <= n; ++i) {
                    
            if (ht[i].parent != 0continue;

                    
            if ( (ht[*s1].weight > ht[*s2].weight) && (ht[*s1].weight > ht[i].weight))
                        
            *s1 = i;
                    
            else if ( (ht[*s2].weight > ht[*s1].weight) && (ht[*s2].weight > ht[i].weight))
                        
            *s2 = i;
                }
            }

            /* 通過w存儲的n個權值,來創建一顆哈夫曼樹, ht_ptr指向這顆哈夫曼樹 */
            void CreateHuffmanTree(HuffmanTree *ht_ptr, int *w, int n)
            {
                
            int m;
                
            int i;
                
            int s1, s2;
                HuffmanTree p;
                
                
            if (n <= 1return;
                m 
            = 2 * n - 1;              /* n個字符,需要2n-1個空間來存儲整顆huffman tree */
                
            *ht_ptr = (HuffmanTree)malloc( (m + 1* sizeof(HTNode)); /* 0號單元不用 */

                
            for (p = *ht_ptr + 1, i = 1; i <= n; ++i, ++p, ++w) { /* 初始化數組中前n個單元存儲的字符 */
                    p
            ->weight = *w;
                    p
            ->parent = 0;
                    p
            ->lchild = 0;
                    p
            ->rchild = 0;
                }
                
            for ( ; i <= m; ++i, ++p) { /* 初始化數組中剩余的單元 */
                    p
            ->weight = 0;
                    p
            ->parent = 0;
                    p
            ->lchild = 0;
                    p
            ->rchild = 0;
                }

                
            for (i = n + 1; i <= m; ++i) {
                    Select(
            *ht_ptr, i - 1&s1, &s2);
                    
            /* 設置s1, s2的父親為i */
                    (
            *ht_ptr + s1)->parent = i;
                    (
            *ht_ptr + s2)->parent = i;
                    
            /* 設置i的左孩子為s1, 右孩子為s2 */
                    (
            *ht_ptr + i)->lchild = s1;
                    (
            *ht_ptr + i)->rchild = s2;
                    
            /* 設置i的權值為s1, s2之和 */
                    (
            *ht_ptr + i)->weight = (*ht_ptr + s1)->weight + (*ht_ptr + s2)->weight;
                }
            }

            /* 對ht_ptr存儲的哈夫曼樹的n個葉子節點進行哈夫曼編碼 */
            void HuffmanCoding(HuffmanTree *ht_ptr, HuffmanCode *hc_ptr, int n)
            {
                
            int i;
                
            int start;
                
            char *cd = NULL;
                
                
            *hc_ptr = (HuffmanCode)malloc( (n + 1* sizeof(char *));

                cd 
            = (char *)malloc(n * sizeof(char));
                cd[n 
            - 1= '\0';

                
            for (i = 1; i <= n; ++i) {
                    start 
            = n - 1;

                    
            int current, father;
                    
            for (current = i, father = (*ht_ptr + i)->parent; /* 從葉子節點開始,并取得父節點father */
                         father 
            != 0;                                 /* 父節點為0時及到達了根節點 */
                         current 
            = father, father = (*ht_ptr + father)->parent) { /* 逐漸向根節點靠攏 */
                        
            if ( (*ht_ptr + father)->lchild == current) /* 當前節點為左孩子 */
                            cd[
            --start] = '0';
                        
            else
                            cd[
            --start] = '1';

                    }

                    
            *(*hc_ptr + i) = (char *)malloc( (n - start) * sizeof(char));
                    strcpy(
            *(*hc_ptr +i), &cd[start]);
                }
                free(cd);
            }


            posted on 2009-09-28 17:49 Marcky 閱讀(584) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構和算法

            久久久久九国产精品| 久久精品免费观看| 久久久久99这里有精品10| 久久精品国产亚洲AV不卡| 久久本道伊人久久| 久久妇女高潮几次MBA| 国产精品VIDEOSSEX久久发布| 亚洲日韩欧美一区久久久久我 | 伊人久久大香线焦综合四虎| 99久久精品免费观看国产| 久久人人爽人人爽人人片AV高清 | 久久露脸国产精品| 精品久久久久久中文字幕大豆网| 99久久久久| 国产精品对白刺激久久久| 中文字幕无码久久久| 国产精品免费久久久久电影网| 色妞色综合久久夜夜| 亚洲七七久久精品中文国产| 日韩亚洲欧美久久久www综合网| 99久久国产精品免费一区二区| 免费精品99久久国产综合精品| 亚洲国产精品高清久久久| 久久久这里只有精品加勒比| 久久久久无码精品| 久久91精品综合国产首页| 99久久免费只有精品国产| 2022年国产精品久久久久| 久久国产精品99精品国产| 久久天天躁狠狠躁夜夜躁2014| 亚洲欧美日韩精品久久亚洲区 | 成人精品一区二区久久久| 国产精品无码久久久久久| 日韩AV无码久久一区二区| 久久SE精品一区二区| 精品久久久久久无码不卡| 伊人久久大香线蕉综合网站| 国产精品乱码久久久久久软件 | 婷婷久久精品国产| 亚洲午夜久久久| 久久九九久精品国产免费直播|