#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....