⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffman算法源代码.txt

📁 数据结构里比较常见到的压缩算法。希望对大家有用。
💻 TXT
📖 第 1 页 / 共 2 页
字号:
VC的,就顺手贴了过来了,算法流程应该是最 
重要的,很多讲数字压缩的都有Huffman算法. 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <dir.h> 
#include <dos.h> 
#include <direct.h> 
#include <bios.h> 
#include <conio.h> 
#include <time.h> 
#define EXIT_OK 0 
#define EXIT_FAILED -1 
////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////// 
FILE  *infile, *outfile; 
unsigned long int  textsize = 0, codesize = 0, printcount = 0; 
void Error(char *message) 
{ 
        printf("\n%s\n", message); 
        exit(-1); 
} 
/* LZSS Parameters */ 
#define N               4096    /* Size of string buffer */ 
#define F               60      //* Size of look-ahead buffer 60 
#define THRESHOLD       2 
#define NIL             N       /* End of tree's node  */ 
unsigned char 
                text_buf[N + F -1];//-1 
int             match_position, match_length, 
                lson[N + 1], rson[N + 257], dad[N + 1]; 
void InitTree(void)  /* Initializing tree */ 
{ 
        int  i; 
        for (i = N + 1; i <= N + 256; i++) 
                rson[i] = NIL;                  /* root */ 
        for (i = 0; i < N; i++) 
                dad[i] = NIL;                   /* node */ 
} 
void InsertNode(int r)  /* Inserting node to the tree */ 
{ 
        int  i, p, cmp; 
        unsigned char  *key; 
        unsigned c; 
        cmp = 1; 
        key = &text_buf[r]; 
        p = N + 1 + key[0]; 
        rson[r] = lson[r] = NIL; 
        match_length = 0; 
        for ( ; ; ) { 
                if (cmp >= 0) { 
                        if (rson[p] != NIL) 
                                p = rson[p]; 
                        else { 
                                rson[p] = r; 
                                dad[r] = p; 
                                return; 
                        } 
                } else { 
                        if (lson[p] != NIL) 
                                p = lson[p]; 
                        else { 
                                lson[p] = r; 
                                dad[r] = p; 
                                return; 
                        } 
                } 
                for (i = 1; i < F; i++) 
                        if ((cmp = key[i] - text_buf[p + i]) != 0) 
                                break; 
                if (i > THRESHOLD) { 
                        if (i > match_length) { 
                                match_position = ((r - p) & (N - 1)) - 1; 
                                if ((match_length = i) >= F) 
                                        break; 
                        } 
                        if (i == match_length) { 
                                if ((c = ((r - p) & (N - 1)) - 1) < match_po 
sitoon) { 
                                        match_position = c; 
                                } 
                        } 
                } 
        } 
        dad[r] = dad[p]; 
        lson[r] = lson[p]; 
        rson[r] = rson[p]; 
        dad[lson[p]] = r; 
        dad[rson[p]] = r; 
        if (rson[dad[p]] == p) 
                rson[dad[p]] = r; 
        else 
                lson[dad[p]] = r; 
        dad[p] = NIL;  /* remove p */ 
} 
void DeleteNode(int p)  /* Deleting node from the tree */ 
{ 
        int  q; 
        if (dad[p] == NIL) 
                return;                 /* unregistered */ 
        if (rson[p] == NIL) 
                q = lson[p]; 
        else 
        if (lson[p] == NIL) 
                q = rson[p]; 
        else { 
                q = lson[p]; 
                if (rson[q] != NIL) { 
                        do { 
                                q = rson[q]; 
                        } while (rson[q] != NIL); 
                        rson[dad[q]] = lson[q]; 
                        dad[lson[q]] = dad[q]; 
                        lson[q] = lson[p]; 
                        dad[lson[p]] = q; 
                } 
                rson[q] = rson[p]; 
                dad[rson[p]] = q; 
        } 
        dad[q] = dad[p]; 
        if (rson[dad[p]] == p) 
                rson[dad[p]] = q; 
        else 
                lson[dad[p]] = q; 
        dad[p] = NIL; 
} 
/* Huffman coding parameters */ 
#define N_CHAR          (256 - THRESHOLD + F) 
                                /* character code (= 0..N_CHAR-1) */ 
#define T               (N_CHAR * 2 - 1)        /* Size of table */ 
#define R               (T - 1)                 /* root position */ 
#define MAX_FREQ        0x8000 
} 
                                        /* update when cumulative frequency 
*/ 
                                        /* reaches to this value */ 
typedef unsigned char uchar; 
/* 
* Tables for encoding/decoding upper 6 bits of 
* sliding dictionary pointer 
*/ 
/* encoder table */ 
uchar p_len[64] = { 
        0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 
        0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 
        0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
        0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 
        0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 
        0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 
        0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 
        0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 
}; 
uchar p_code[64] = { 
        0x00, 0x20, 0x30, 0x40, 0x50, 0x58, 0x60, 0x68, 
        0x70, 0x78, 0x80, 0x88, 0x90, 0x94, 0x98, 0x9C, 
       0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC, 
        0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, 
        0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE, 
        0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE, 
        0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 
        0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF 
}; 
/* decoder table */ 
uchar d_code[256] = { 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 
        0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 
        0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
        0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 
        0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 
        0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 
        0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
        0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 
        0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
        0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 
        0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 
        0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 
        0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 
        0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 
        0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 
        0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 
        0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 
        0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 
        0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 
        0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 
        0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, 
        0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F, 
        0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 
        0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 
        0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 
        0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 
        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 
        0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 
}; 
uchar d_len[256] = { 
        0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 
        0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 
        0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 
        0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 
        0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
        0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
        0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
        0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
        0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
        0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 
        0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 
        0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 
        0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 
        0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 
        0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 
        0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 
        0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 
        0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 
        0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
        0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
        0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
       0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
        0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
        0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 
        0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 
        0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 
        0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 
        0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 
        0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 
        0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 
        0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 
        0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 
}; 
unsigned freq[T + 1];   /* cumulative freq table */ 
/* 
* pointing parent nodes. 
* area [T..(T + N_CHAR - 1)] are pointers for leaves 
*/ 
int prnt[T + N_CHAR]; 
/* pointing children nodes (son[], son[] + 1)*/ 
int son[T]; 
unsigned getbuf = 0; 
uchar getlen = 0; 
int GetBit(void)        /* get one bit */ 
{ 
        int i; 
        while (getlen <= 8) { 
                if ((i = getc(infile)) < 0) i = 0; 
                getbuf |= i << (8 - getlen); 
                getlen += 8; 
        } 
        i = getbuf; 
        getbuf <<= 1; 
        getlen--; 
        return (i<0); 
} 
int GetByte(void)       /* get a byte */ 
{ 
        long int i; 
        while (getlen <= 8) { 
                if ((i = getc(infile)) < 0) i = 0; 
                getbuf |= i << (8 - getlen); 
                getlen += 8; 
        } 
        i = getbuf; 
        getbuf <<= 8; 
        getlen -= 8; 
        return (i>>8); 
} 
unsigned putbuf = 0; 
uchar putlen = 0; 
void Putcode(int l, unsigned c)         /* output c bits */ 
{ 
        putbuf |= c >> putlen; 
        if ((putlen += l) >= 8) { 
                putc(putbuf >> 8, outfile); 
                if ((putlen -= 8) >= 8) { 
                        putc(putbuf, outfile); 
                        codesize += 2; 
                        putlen -= 8; 
                        putbuf = c << (l - putlen); 
                } else { 
                        putbuf <<= 8; 
                        codesize++; 
                } 
        } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -