LZW编码通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。 LZW压缩算法是Unisys的专利,有效期到2003年,所以相关算法大多也已过期。

本代码只完毕了LZW的编码与解码算法功能,相对网上找到的非常多代码而言较为简(cai)单(bi)。了解struct && 会递归就可以,算是长处吧。

#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <iostream>
#include <stdlib.h>
#include <string.h> using namespace std; struct Node{
int pre; //前缀单词相应码字
char c; //当前字符
}KDA[65535]; int cnt,P,Q;
char W,V; void Init(){ //前256个字典由相应ASCII码生成
for(int i = 0;i < 256; i ++){
KDA[i].pre = -1;
KDA[i].c = i;
}
cnt = 256;
P = -1;
} void Out(int x){ //递归输出码字相应单词,首位另存用于建立字典
if(KDA[x].pre != -1){
Out(KDA[x].pre);
}
else {
V = KDA[x].c;
}
printf("%c",KDA[x].c);
} void Search(){
int flag = 0;
for(int i = 0;i < cnt;i ++){
if(KDA[i].pre == P && KDA[i].c == W){//字典已存在则更新前缀相应码字
P = i;
flag = 1;
}
}
if(!flag){ //不存在则扩充字典,输出前缀相应码字并更新前缀单词
KDA[cnt].pre = P;
KDA[cnt].c = W;
printf("%03X ",P);
P = (int)W;
cnt ++;
}
} void Research(){
Out(Q);
if(P != -1){ //假设前一位码字不为空,则将前一位相应单词作为前缀与本单词第一位合并作为新单词增加字典
KDA[cnt].pre = P;
KDA[cnt].c = V;
cnt ++;
}
} void Compress(){<span style="white-space:pre"> </span>//编码过程
Init();
freopen("LZWin.txt","r",stdin);
freopen("LZWch.txt","w",stdout);
while((W = getchar()) && W != EOF){
Search();
}
printf("%03X\n",P);
} void Decompress(){<span style="white-space:pre"> </span>//解码过程
Init();
freopen("LZWch.txt","r",stdin);
freopen("LZWout.txt","w",stdout);
while(scanf("%03X",&Q)!= EOF){
Research();
}
} int main(){
Compress();
Decompress();
return 0;
}

【手打】LZW编码的C/C++实现的更多相关文章

  1. GDI+中GIF图片的显示

    某位网友曾经问过我GDI+中Gif图像显示的问题,一直没时间给你写,在此致歉.我把这篇文章送给他. 一.GIF格式介绍 1.概述 GIF(Graphics Interchange Format,图形交 ...

  2. NOIP2010-普及组初赛C语言解析

    第十六届全国青少年信息学奥林匹克联赛初赛试题 一.单项选择题 (共20题,每题1.5分,共计30分.每题有且仅有一个正确选项.) 1.2E+03表示(  D  ). A.2.03          B ...

  3. PNG,JPEG,BMP,JIF图片格式详解及其对比

    原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...

  4. 【转】gif文件格式详解

    1.概述 ~~~~~~~~ GIF(Graphics Interchange Format,图形交换格式)文件是由 CompuServe公司开发的图形文件格式,版权所有,任何商业目的使用均须 Comp ...

  5. 音视频入门-18-手动生成一张GIF图片

    * 音视频入门文章目录 * GIF 编码知识 GIF 包含的数据块: 文件头(Header) 逻辑屏幕标识符(Logical Screen Descriptor) 全局颜色表(Global Color ...

  6. 可能是最通俗的Lempel-Ziv-Welch (LZW)无损压缩算法详述

    最近工作正好接触到这一块,试着自己总结了一下,给需要的人提供一点帮助. 一.概述 首先看看百度百科里的一句话介绍:“LZW就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩.” 简单来 ...

  7. LZW压缩算法——简明原理与实现

    LZW和哈夫曼编码一样,是无损压缩中的一种.该算法通过建立字典,实现字符重用与编码,适用于source中重复率很高的文本压缩.本文首先讲下LZW的编解码原理,然后给出LZW的实现code. ***** ...

  8. Objective-C 编码建议

    Objective-C 是 C 语言的扩展,增加了动态类型和面对对象的特性.它被设计成具有易读易用的,支持复杂的面向对象设计的编程语言.它是 Mac OS X 以及 iPhone 的主要开发语言. C ...

  9. LZW压缩算法

    转载自http://www.cnblogs.com/jillzhang/archive/2006/11/06/551298.html 记录此处仅自己供学习之用 lzw解压缩算法: 用单个字符初始化字符 ...

随机推荐

  1. commons-logging \ log4j \ slf4j 之间的关系

    最近的一个web项目中要使用到日志,但是对常用的日志记录工具(框架)着实不是很理解,在此mark一下. 1.commons-logging.jar common-logging是apache提供的一个 ...

  2. 【c语言】求最大值

    一.我个人觉得求最大值比较简单的一种方法(当然同时求最大值和最小值时稍微改改也能行) #include <stdio.h> int main(void) { int f, i, max; ...

  3. Java多线程实现......(1,继承Thread类)

    MyThread.java 中的代码: public class MyThread extends Thread{ private int startPrint,printCount; private ...

  4. Qt Creator插件工作流程代码走读

    Qt Creator有个很风骚的插件管理器PluginManager,还有个很骚包的插件说明PluginSpec.基本上,所有的Qt程序的入口都是传统的C程序一样,代码流程从main()函数开始.  ...

  5. 关于String.concat()方法和StringBuffer.append()方法的学习:方法是如何追加字符到源字符串的

    问题分析: 首先,看看两段代码的运行结果,两段代码分别是: 第一段代码,关于String.concat()方法的测试: public static void main(String[] args) { ...

  6. GQ_百度百科

    GQ_百度百科 <GQ>杂志(原名<Gentlemen's Quarterly>,中文名<智族>)是一本男性月刊,内容著重于男性的时尚.风格.文化,也包括美食.电影 ...

  7. More Divisors(反素数)

    More Divisors Time Limit: 2 Seconds      Memory Limit: 65536 KB Everybody knows that we use decimal ...

  8. UVA 1160 - X-Plosives 即LA3644 并查集判断是否存在环

    X-Plosives A secret service developed a new kind ofexplosive that attain its volatile property only ...

  9. iOS UIView非常用方法及属性详解

    在调用视图的 Quartz  调用都可以正确地在视图中描画.   视图对象通过 bounds .和 center  属 性声明来跟踪自己的大小和位置.frame 属性包含一个矩形,即边框矩形,用于指定 ...

  10. ajax对服务器路径请求

    $.post('/aaaa/bbbb/cccc', { "paraName": value}, function (data) {                        S ...