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

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

  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <math.h>
  4. #include <iostream>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. using namespace std;
  9.  
  10. struct Node{
  11. int pre; //前缀单词相应码字
  12. char c; //当前字符
  13. }KDA[65535];
  14.  
  15. int cnt,P,Q;
  16. char W,V;
  17.  
  18. void Init(){ //前256个字典由相应ASCII码生成
  19. for(int i = 0;i < 256; i ++){
  20. KDA[i].pre = -1;
  21. KDA[i].c = i;
  22. }
  23. cnt = 256;
  24. P = -1;
  25. }
  26.  
  27. void Out(int x){ //递归输出码字相应单词,首位另存用于建立字典
  28. if(KDA[x].pre != -1){
  29. Out(KDA[x].pre);
  30. }
  31. else {
  32. V = KDA[x].c;
  33. }
  34. printf("%c",KDA[x].c);
  35. }
  36.  
  37. void Search(){
  38. int flag = 0;
  39. for(int i = 0;i < cnt;i ++){
  40. if(KDA[i].pre == P && KDA[i].c == W){//字典已存在则更新前缀相应码字
  41. P = i;
  42. flag = 1;
  43. }
  44. }
  45. if(!flag){ //不存在则扩充字典,输出前缀相应码字并更新前缀单词
  46. KDA[cnt].pre = P;
  47. KDA[cnt].c = W;
  48. printf("%03X ",P);
  49. P = (int)W;
  50. cnt ++;
  51. }
  52. }
  53.  
  54. void Research(){
  55. Out(Q);
  56. if(P != -1){ //假设前一位码字不为空,则将前一位相应单词作为前缀与本单词第一位合并作为新单词增加字典
  57. KDA[cnt].pre = P;
  58. KDA[cnt].c = V;
  59. cnt ++;
  60. }
  61. }
  62.  
  63. void Compress(){<span style="white-space:pre"> </span>//编码过程
  64. Init();
  65. freopen("LZWin.txt","r",stdin);
  66. freopen("LZWch.txt","w",stdout);
  67. while((W = getchar()) && W != EOF){
  68. Search();
  69. }
  70. printf("%03X\n",P);
  71. }
  72.  
  73. void Decompress(){<span style="white-space:pre"> </span>//解码过程
  74. Init();
  75. freopen("LZWch.txt","r",stdin);
  76. freopen("LZWout.txt","w",stdout);
  77. while(scanf("%03X",&Q)!= EOF){
  78. Research();
  79. }
  80. }
  81.  
  82. int main(){
  83. Compress();
  84. Decompress();
  85. return 0;
  86. }

【手打】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. beta分布

    http://blog.csdn.net/sweetrryy/article/details/6436358

  2. javascript 关闭页面提示

    window.onbeforeunload = function (e) { e = e || window.event; // For IE and Firefox prior to version ...

  3. hibernate Annotation 以及注解版的数据关联 4.4

    目的是不写xxx.hbm.xml映射文件,使用注解 主配置文件还是要有hibernate.cfg.xml <?xml version="1.0" encoding=" ...

  4. HDU 1862 EXCEL次序 (排序水问题)

    Problem Description Excel对能够记录一组由任意列排序指定.现在,请把你编译的代码类似特征.   Input 測试输入包括若干測试用例. 每一个測试用例的第1行包括两个整数 N ...

  5. BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )

    最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #inc ...

  6. USACO Ski Course Design 暴力

    从Min到Max范围内暴力一下即可. /* ID: wushuai2 PROG: skidesign LANG: C++ */ //#pragma comment(linker, "/STA ...

  7. 纪念一下第一次写的django代码

    @csrf_exemptdef new_project_detail(request):    if 'project_name' not in request.POST or 'project_po ...

  8. 设计模式(七)组合模式Composite(结构型)

    设计模式(七)组合模式Composite(结构型) 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 ...

  9. 进入MFC讲坛的前言(一)

    在这里,我想谈谈自己学习MFC的一些体会.我是从1997年才开始在Window下编写程序的.在这之前,我编写过一些DOS程序,包括一个简单的全屏幕编辑器和一个带函数的表达式解释器,都是一些小的程序.W ...

  10. python模块学习---HTMLParser(解析HTML文档元素)

    HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析. 本文主要简单讲一下HTMLParser的用法. 使用时需要定义一个从类HTMLParser继承的类,重定义 ...