//HuffmanTree.h#ifndef HUFFMANTREE_H#define HUFFMANTREE_H#include <stdio.h>#include <stdlib.h>enum BOOLEAN{ FALSE, TRUE };enum STATE{ONLINK,ONTREE,VIRTUAL};#pragma pack(push)#pragma pack(4)struct _Node{int iValue;int iState;struct _Node* pNext;//struct _Node* pParent;struct _Node* pLChild;struct _Node* pRChild;};typedef struct _Node Node;typedef struct{Node* pRoot;int iSize;}HuffTree;#pragma pack(pop)#endif
// HuffmanTree. c # include "HuffmanTree. h" HuffTree * InitTree () {HuffTree * pTree = (HuffTree *) malloc (sizeof (HuffTree); if (! PTree) return (HuffTree *) NULL; pTree-> iSize = 0; pTree-> pRoot = NULL; return pTree;} Node * CreateNode (int iValue, int iState = ONLINK) {Node * pNode = (Node *) malloc (sizeof (Node); if (! PNode) return NULL; pNode-> iState = iState; pNode-> iValue = iValue; pNode-> pNext = NULL; pNode-> pLChild = NULL; pNode-> pRChild = NULL; // pNode-> pParent = NULL; return pNode;} Node * CreateNodeList (int weightArr [], int iArrSize) {if (iArrSize <= 0) return NULL; node * pHeader = CreateNode (weightArr [0]); Node * pNode = pHeader; int I = 1; for (; I <iArrSize; I ++) {pNode-> pNext = CreateNode (weightArr [I]); pNode = PNode-> pNext;} return pHeader;} int isContinue (Node * pList) {int iCount = 0; while (pList) {pList = pList-> pNext; if (++ iCount> = 2) return 1;} return 0;} Node * ResortList (Node * pList, Node * pNew) {if (! PList &&! PNew) return NULL; if (! PList & pNew) return pNew; if (pList-> iValue> pNew-> iValue) {// Add it to the header pNew-> pNext = pList; return pNew ;} node * pHeader = pList; Node * pPrior = NULL; while (pList) {if (pNew-> iValue <pList-> iValue) {break;} pPrior = pList; pList = pList-> pNext;} if (! PList) {// Add to the end pPrior-> pNext = pNew; pNew-> pNext = NULL;} else {// insert intermediate pPrior-> pNext = pNew; pNew-> pNext = pList;} return pHeader;} void PrintNode (Node * pNode) {if (pNode) printf ("% d", pNode-> iValue );} void InOrderTraverse (Node * pNode) {if (! PNode) return; InOrderTraverse (pNode-> pLChild); PrintNode (pNode); InOrderTraverse (pNode-> pRChild);} void PreOrderTraverse (Node * pNode) {if (! PNode) return; PrintNode (pNode); PreOrderTraverse (pNode-> pLChild); PreOrderTraverse (pNode-> pRChild);} Node * CreateHuffTree (Node * pList) {// create a Huffman Treeif (! PList) return NULL; Node * pNew = NULL; while (isContinue (pList) {pNew = CreateNode (pList-> iValue + pList-> pNext-> iValue, VIRTUAL ); if (! PNew) return NULL; pNew-> pLChild = pList; pNew-> pRChild = pList-> pNext; pNew-> pNext = NULL; pList = pList-> pNext; pNew-> pLChild-> pNext = NULL; pNew-> pRChild-> pNext = NULL; // pList-> pParent = pNew; // pList-> pNext-> pParent = pNew; pList = ResortList (pList, pNew);} return pList;} int main (int argc, char ** argv) {HuffTree * pTree = InitTree (); // The ordered data int WeightArr [9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; pTree-> pRoot = CreateHuffTree (CreateNodeList (WeightArr, 9); puts ("InOrderTraverse"); InOrderTraverse (pTree-> pRoot ); puts ("\ nPreOrderTraverse"); PreOrderTraverse (pTree-> pRoot); puts (""); return 0 ;}