哈夫曼演算法

2021-04-21 09:24:21 字數 3580 閱讀 8629

#include

#include

#include

#include

#include

/*宣告兩種鍊錶結構----start*/

struct node_a;

typedef struct node_a node,*list;

list head=null;

struct nodeb;

typedef struct nodeb node_b,*list_b;  /*jiang bianma xieru wenjian*/

list_b head_b=null;

/*宣告兩種鍊錶結構----end*/

/*哈夫曼演算法種相關的3種結構的宣告-----start*/

struct forest;

struct alphabet;

struct tree;

typedef struct tree *tree_ptr,tree_node;

typedef struct forest *forest_ptr,forest_node;

typedef struct alphabet *alphabet_ptr,alphabet_node;

tree_ptr tree1;

forest_ptr forest1;

alphabet_ptr alphabet1;

int lasttree,lastnode;

int least,second;

/*哈夫曼演算法種相關的3種結構的宣告-----end*/

/**************stack difination start****************/

struct stacknode;

typedef struct stacknode stack_node;

typedef stack_node *link;

link top=null;

void push(char *item)

p->bian_ma=item;

p->next=top;

top=p;

} else

top->bian_ma=item;

top->next=null;

} }

void pop(void)

void makenull(void)

int empty()

char* tops(void)

void display_stack(link s)

} /***************************stack__difination is end************************/

void display(list h)

} void display_b(list_b h)

} void insert(char item)

else

ptr=ptr->next;

} ptr=head;

if(flag==1)

return;

else

} }

void insert_b(char item)

else

ptr_b->next=(list_b)malloc(sizeof(node_b));

ptr_b->next->data=item;

ptr_b->next->next=null;

} }

void search(void)

if(ch==eof)

break;

insert(ch);   /*插入元素進鍊表1*/

insert_b(ch); /*插入元素進鍊表2*/

} printf("/n");

fclose(fp);

} void display_struct(int n)

getch();

printf("/n/nalphabet_struct_arry :/n/n/n");

for(i=0;i<=n;i++)

getch();

printf("/n/ntree_struct_arry :/n/n/n");

for(i=0;i<=2*n-1;i++)

printf("%d,%d,%d/n",tree1[i].lchild,tree1[i].rchild,tree1[i].parent);

printf("/n/n***********************************===/n/n");

getch();

} int init_struct(void)

ptr=head->next;

forest1=(forest_ptr)malloc(sizeof(forest_node)*n+sizeof(forest_node));

alphabet1=(alphabet_ptr)malloc(sizeof(alphabet_node)*n+sizeof(alphabet_node));

tree1=(tree_ptr)malloc(sizeof(tree_node)*n*2-sizeof(tree_node));

forest1[0].weight=alphabet1[0].probability=0.0;

forest1[0].root=alphabet1[0].leaf=0;

alphabet1[0].symbol='0';

while(ptr!=null)

for(i=0;i<=2*n-1;i++)

return n;

} void creat(void)

fclose(fp);

} void creat_bianma(int number)

if(tree1[p].lchild==i)

push("0");

else

push("1");

strcpy(bm," "); /*目的:使建立編碼檔案中的各編碼中間存在間隔*/

while(!empty())

alphabet1[j].bianma=malloc(sizeof(char)*number);

strcpy(alphabet1[j].bianma,bm);

printf("/n%c:%s",alphabet1[j].symbol,alphabet1[j].bianma); /*列印出相應的編碼*/

getch();

} }

void write_new_file(int number)

} ptr=ptr->next;

} }

fclose(fp);

} void main(void)while(ch=='y');

} /*哈夫曼演算法-----defination_start*/

void lightones(void)

else

for(i=3;i<=lasttree;i++)

if(forest1[i].weight1)

}

哈夫曼樹和哈夫曼演算法

1 最優二叉樹 具有最小加權路徑長度的二叉樹 2 哈夫曼演算法 由哈夫曼給出,用於構造最優二叉樹的演算法 3 哈夫曼樹 用哈夫曼演算法構造的最優二叉樹 4 哈夫曼演算法 很熟,所以就略了 5 函式createhfmtree的步驟 首先,構造n棵哈夫曼樹的物件,每棵樹只有乙個權值為w i 的根節點,且...

哈夫曼樹的構造演算法,哈夫曼編碼演算法

include define max 100 define maxvalue 500 typedef struct int weight int parent,lchild,rchild node 哈夫曼樹結點型別 以下部分定義哈夫曼編碼儲存結構 typedef structcodetype typ...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....