HuffmanCode---數組實現

#include <stdio.h>
#inlucde <stlib.h>

//定義結構體數組類型

typedef struct
{
   char word;//字符域;
   int weight;//字符對應的權值域;
   int left,right,parent;//分別是左子女,右子女,雙親結點域;
   int * code;//編碼域;
}HuffNode;

//CreateHuffmanTree

oid CreateHuffmanTree(HuffNode * F,int n)
{
    int loop;
    int k1,k2;
    int i;
    for(loop=0;loop<n-1;loop++)
    {
        for(k1=0;k1<n+loop&&F[k1].parent!=-1;k1++);//找第一個還未掛上去的結點;
        for(k2=k1+1;k2<n+loop&&F[k2].parent!=-1;k2++);//找第二個還未掛上去的結點;
        //for循環,出來k1指weight最小,k2指weight次小;
        for(i=k2;i<n+loop;i++)
        {
            if(F[i].parent==-1)
            {
                if(F[i].weight<F[k1].weight)
                {
                    k2=k1;
                    k1=i;
                }
                else if(F[i].weight<F[k2].weight)
                k2=i;
            }
        }
        //初始化新生成的雙親結點;
        F[i].word='x';
        F[i].weight=F[k1].weight+F[k2].weight;
        F[i].left=k1;
        F[i].right=k2;
        F[i].parent=-1;
        //初始化k1,k2的雙親域;
        F[k1].parent=F[k2].parent=i;
    }
}

//CreateHuffmanCode

void CreateHuffmanCode(HuffNode * F,int n)
{
    int c,pa,i;
    int * p;
    for(i=0;i<n;i++)
    {
        F[i].code=p=(int *)malloc(n*sizeof(int));//初始化code域;
        p[0]=0;//p[0]作編碼數組的崗哨,永遠指向最後一位碼,因此初始化0;
        c=i;//c表示當前結點下標;
        while(F[c].parent!=-1)//循環終止條件:當前結點爲根結點;
        {
            pa=F[c].parent;
            //左子女賦0,右子女賦1;
            if(F[pa].left==c)
            p[++p[0]]=0;
            else
            p[++p[0]]=1;
            c=pa;
        }
    }
 }

//PrintHuffmanCode

void PrintHuffmanCode(HuffNode * F,int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        printf("%s",F[i].word);
        printf("-----");
        for(j=F[i].code[0];j>0;j--)
        printf("%d",F[i].code[j]);
        printf("\n");
    }
 } 

//main函數體

int main(void)
{
    HuffNode * F;
    int n,w,i;
    char ch;
    printf("請輸入葉子結點個數n:");
    scanf("%d",&n);
    //創建森林
    F=(HuffNode *)malloc((2*n+1)*sizeof(HuffNode));
    for(i=0;i<n;i++)
    {
        printf("請輸入word的值:");
        scanf("%s",&ch);
        F[i].word=ch;
        printf("請輸入weight的值:");
        scanf("%d",&w);
        F[i].weight=w;
        F[i].left=F[i].right=F[i].parent=-1;
    }
    //創建HuffmanTree
    CreateHuffmanTree(F,n); 
    //創建HuffmanCode
    CreateHuffmanCode(F,n);
    //輸出
    PrintHuffmanCode(F,n); 
    return 0;
}

希望能幫到大家!
我的希望是:世界和平!
嘻嘻!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章