1. 程式人生 > >資料結構C語言版赫夫曼樹

資料結構C語言版赫夫曼樹

 /*自己編寫的C語言的赫夫曼樹*/
#include<stdio.h>
#include<string.h>
#define HUFFSIZE 8
#define TOTALSIZE (2*HUFFSIZE) 
typedef struct 
{
	int weight;
	int parent;
	int leftchild;
	int rightchild;
}HuffNode;
typedef HuffNode HuffTree[TOTALSIZE];

typedef struct
{
	char ch;
	char code[HUFFSIZE + 1];
}HuffCoding;
typedef HuffCoding HuffCode[HUFFSIZE + 1 ];

void Init_HuffTree(HuffTree ht, int a[])
{
	memset(ht, 0, sizeof(HuffTree));
	for (int i = 1; i < HUFFSIZE + 1; ++i)
	{
		ht[i].weight = a[i - 1];
	}
}

void Print_Hufftree(HuffTree ht)  
{
	printf("%5s   %5s    %5s    %5s    %5s\n"," ID","weight","parent","leftchild","rightchild");
	for (int i = 1; i < TOTALSIZE ; ++i)
	{
		printf("%5d    %5d    %5d    %5d    %5d\n", i, ht[i].weight, ht[i].parent, ht[i].leftchild, ht[i].rightchild);

	}
}

int find_min1(HuffTree ht,int n)
{
	int i = 1;
	while ((i < n)&&(ht[i].parent != 0))++i;
	for (int j = 1 + i; j < n; ++j)
	{
		if((ht[j].parent==0)&&(ht[i].weight>ht[j].weight))
		{
			i = j;
		}
	}
	return i;
}

void find_min2(HuffTree ht, int n, int *min2)
{
	int min1;
	min1 = find_min1(ht, n);
	int i = 1;
	while (((i < n )&&(ht[i].parent != 0)) || (i==min1))++i;
	for (int j = 1 + i; j < n; ++j)
	{
		if ((ht[j].parent == 0) && (ht[i].weight > ht[j].weight) &&( j!=min1))
		{
			i = j;
		}
	}
	*min2 = i;
}

void CreateHuffTree(HuffTree ht)
{
	int left, right;
	int k = HUFFSIZE + 1;
	while (k < TOTALSIZE)
	{
		left=find_min1(ht, k);
		find_min2(ht, k, &right);
		ht[k].weight = ht[left].weight + ht[right].weight;
		ht[k].leftchild = left;
		ht[k].rightchild = right;
		ht[left].parent = k;
		ht[right].parent = k;
		++k;
	}
}

void Init_HuffCode(HuffCode hc,char br[])
{
	memset(hc,0,sizeof(HuffCode));
    for (int i = 1; i < HUFFSIZE + 1; ++i)
   {
		hc[i].ch = br[i - 1];
		hc[i].code[0] = '\0';
	}
}

void CreateHuffCode(HuffTree ht, HuffCode hc)
{
	char code[HUFFSIZE + 1];
	int child, parent;
	for (int i = 1; i < HUFFSIZE + 1; ++i)
	{
		int k=HUFFSIZE;
		code[k] = '\0';
		child = i;
		while ((parent=ht[child].parent) != 0)
		{
			code[--k] = ht[parent].leftchild == child ? '0' : '1';
			child = parent;
		}
		strcpy_s(hc[i].code, &code[k]);
	}
}
void Print_Code(HuffCode hc)
{
	for (int i = 1; i < HUFFSIZE + 1; ++i)
	{
		printf("%c的赫夫曼碼:%s\n", hc[i].ch, hc[i].code);
	}
}
int main()
{
	HuffTree ht;
	HuffCode hc;
	int a[] = { 1,2,23,4,5,6,7,8 };
	char br[] = { 'a','b','c','d','e','f','g','h' };
	Init_HuffTree(ht, a);
	Print_Hufftree(ht);
	CreateHuffTree(ht);
	Print_Hufftree(ht);
	Init_HuffCode(hc,br);
	CreateHuffCode(ht, hc);
	Print_Code(hc);
	getchar();
	return 0;
}

相關推薦

資料結構C語言

/*自己編寫的C語言的赫夫曼樹*/#include<stdio.h> #include<string.h> #define HUFFSIZE 8 #define TOTALSIZE (2*HUFFSIZE) typedef struct {

c語言實現的構建以及生成編碼(《資料結構》演算法6.12)

這個程式是根據《資料結構》演算法6.12用c語言實現的程式,赫夫曼樹就不多說了,直接看程式碼,程式碼上都有註釋。 下面程式碼: #include<stdio.h> #include<iostream> #include<stdlib.h>

Android資料結構與演算法(七):

近期忙著新版本的開發,此外正在回顧C語言,大部分時間沒放在資料結構與演算法的整理上,所以更新有點慢了,不過既然寫了就肯定盡力將這部分完全整理好分享出來。 言歸正傳,開啟本篇的正文。 一、什麼是赫夫曼樹 給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也

資料結構之---C語言實現哈和編碼

//哈夫曼樹 //楊鑫 #include <stdio.h> #include <stdlib.h> typedef int ElemType; struct BTreeNode { ElemType data; struct BTr

資料結構C語言(第二章迷宮)

轉自未空blog   //我剛開始對STACK的記憶體分配那有點問題,後來用這個程式碼除錯了下,感覺有點明白了,   地址由高到低分配,然後程式碼中的base和top剛開始指向地址最低的地方,記憶體不夠時重新在原有基礎上新增記憶體,top指向原有的棧頂,然後繼續

資料結構c語言 嚴蔚敏 順序線性表12個基本操作及演算法的實現

標頭檔案: c1.h (相關標頭檔案及函式結果狀態程式碼集合) /* c1.h (程式名) */ #include<string.h> #include<ctype.h> #include<malloc.h> /

資料結構c語言 嚴蔚敏(演算法2.1 將所有在Lb中但不在La中的元素插入到La中)

標頭檔案: c1.h (相關標頭檔案及函式結果狀態程式碼集合) /* c1.h (程式名) */ #include<string.h> #include<ctype.h> #include<malloc.h> /

資料結構(C語言 嚴蔚敏著)——

· 樹(tree)是n(n>=0)個結點的有限集。當n=0時成為空樹,在任意一顆非空樹中: //這裡只需掌握定義,重點在二叉樹      -有且僅有一個特定的稱為根(Root)的結點;     -當n>1時,其餘結點可分為m(m>0)個互不相交的有限集

資料結構(C語言 嚴蔚敏著)——棧和佇列

棧的定義: · 書本定義:棧是一個後進先出的線性表,它只要求只在表尾 進行刪除和插入操作。 · 通俗定義:棧就是一個特殊的線性表(順序表,連結串列),操作上有一些特殊性:     -棧的元素必須“後進先出”。     -棧的操作只能在這個線性表的表尾進行。    

資料結構(C語言 嚴蔚敏著)——串

關於串,下面只介紹堆分配儲存的串。 · 由於堆分配儲存結構的串既有順序儲存結構的特點,處理方便,操作中對串長   又沒有任何限制,更顯靈活,因此在串處理的應用程式中也常被選用。 更char陣列類似 下面直接貼程式碼: #include <stdio.h>

資料結構(C語言 嚴蔚敏著)——線性表

線性表定義:由零個或多個數據元素組成的有限序列。 · 需注意幾個關鍵點: -它是一個序列,也就是說元素之間是有先來後到的。 -若元素存在多個,則第一個元素無前驅,而最後一個元素無後繼,其他元素有且只有一個前驅和一個後繼。 -線性表強調是有限的,無論計算機發展到多強大,

資料結構(C語言)》嚴蔚敏---第一章緒論

資料結構 資料結構主要研究非數值計算問題,資料結構是一門研究非數值計算程式設計中的操作物件,以及這些物件之間關係和操作的學科。 資料結構是相互之間存在一種或多種特定關係的資料元素的集合。 資料結構包括邏輯結構和儲存結構兩個層次。 邏輯結構的四種基本關係: 集合結構 線性結構 樹結構 圖

資料結構c語言》嚴蔚敏學習之路

    大學物聯網工程專業,沒有計組、計網、微原和通原的我,不知道怎麼在這個交叉學科中活下去(學校優秀,認為隨著政策的利好,學生都有工作課程隨意點)。所以,認認真真寫下《資料結構c語言版》嚴蔚敏學習之路,記錄從入門到出不去的過程。     先學離散數學,我認為這是先修

學習筆記------資料結構(C語言)陣列之三元組順序表

//TSMatrix.cpp #include"predefined.h" #include"TSMatrix.h" Status TransposeSMatrix(TSMatrix M,TSMat

順序棧的九種基本操作和實現(資料結構C語言清華大學嚴蔚敏)

棧是僅限定在表尾進行插入和刪除操作的線性表,在嚴蔚敏版的C語言版的資料結構中共定義了九種棧的基本操作;分別是構造 銷燬 清空 棧長 棧頂 插入 刪除 遍歷。下面就是程式碼實現: 標頭檔案和巨集定義(

資料結構C語言--單鏈表的基本功能實現

/* * 構造一個鏈式儲存的線性表(當輸入9999時,結束構造過程),然後輸出該線性表 * 並統計該線性連結串列的長度 。 *注:new和delete是C++的運算子 malloc和free是C++/C的標準庫函式 */ #include<st

資料結構(C語言)》- 和二叉

本文將討論非線性資料結構中的樹型結構。樹型結構中樹和二叉樹最常用,直觀來說,樹是以分支關係定義的層次結構,樹結構在客觀世界中廣泛存在,如人類社會的族譜,最上面是族長,然後下面依次是族長的孩子,孫子等等。這就可以用樹來更加形象的表示。樹在計算機領域中也有十分廣泛地

資料結構C語言線性連結串列的12個基本操作

線性連結串列的12個基本操作 分別是:構造 銷燬 清空      判空  表長 取元      定位  前驅 後繼      插入 刪除遍歷;在此為了好記我分別二字短語三三結合 ,接下來會一一解釋。 標頭檔案和巨集定義 #include<iostream> #i

資料結構C語言之括號匹配

//括號匹配: #include<stdio.h> #include<stdlib.h> #define Stack_size 100 #define Stackincream

資料結構 C語言 約瑟問題

一、問題描述:約瑟夫問題 一個旅行社要從n個旅客中選出一名旅客,為他提供免費的環球旅行服務。旅行社安排這些旅客圍成一個圓圈,從帽子中取出一張紙條,用上面寫的正整數m作為報數值。遊戲進行時,從第s個人開