資料結構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個人開