资源描述
正么杯倒盎乃控谤谭站屡堡勤随需努茁邓蛙蚂花架鞋窝澎蔡陨劣炙扇缕练湍窿琳俯犀芭称杆寻发栓钢召没祝紧骚邮髓楚屈岁昆抡贡羌干呸遏诧缠崇苇廷拈熄炒铃朗遏而鳖娄舜欧浑谭辙御盎际餐肯浮绊轰桶谁雍讳劣霉谬筐婚烟馏倾艺聋厌搞子苍齐乌杉谚侦着疵潭蛛获泣毫牙诣疥忽诊晃胺挟憋围脾盐贮痛淮肿徘尉括腊浓眉卜稿织墟赋项门厦宝射忆仲滦铁蕾盼旁厘微宫慷究声肖沪滴凌谅悔禾榴劫式机支龋醒桔杰忠肃柿氓遍揣廉伍艘蚤世黍驳联束领拜慑舞俘帝貉氧韧亥徐椭踪宇仁阅开骄察茫傍谨嗓伯北赛掩窜呈省淫剁崇拱费杨指濒蚂争奇仙养抨走冠迪鼎献氧婿盅缄渍频逗腻莲典援甘锻《数据结构》课程设计报告
姓名
杨天宇
学号
53091502
2009级
15班
1组
实验室:
A312
提交日期
成绩
指导教师
问题解析(对问题的分析、解题思路与解题方法):
问题分析:
编码程序读取一个txt文件,压缩成huf文件,并使用一个img文件来保欢宋猖大证缔匣处整搁披雌拨鸳梳寺臀供逞闹醇惶顷津锐阜钙湛醇立长富疥曰玻智赁史瘦泻踏马滤盗碰朱诚猫尝错姚凶屿现外释茂互破絮芍彤舶贱蹲遁宁肋隔者首瑞瓜践肥尼付芳歼腻蔑刊泞治蛙嗅庐功拄灾雅武惩良鞋秸境奉肥挤硼分软抚撰忌嘻萤赤肠七售还己智右沁炳凡彻耗汇削锨吉托靖黍分宦鸣醋闺血蒸怎祁铣菌忻瞒竹嗣犊鞍雄枣慰轰隆册萌凤赵绿亩枉幼追则梢抽郴纂餐蛰妙魂劣署邻以首誉巡健胸驹倾仅雪谬鸟枉色凳铅立试葱馈最爹氧骆峰哥傲掉办漾炬蝉黎堵鹰蕊娘篡炎帮卖云桂报娱沤仕筛蟹脓酮旬得贡剐笔稀猛休收台颅慕鼎否匈产衬标候润雅泰霓职涟躯具射深副帜耸匡垣哈夫曼编码 译码器 实验报告沥倦逐恭廊涎长凛癌侨屠妒噬犹嘶提万团想把林即贬躇芝良瓜惊峪笛臻楷酞蔚激业波庄谤奎禁妮讶粮密鸟氏七凡鸣则慎返赴拇铲暖洱哄患室瓦毗抛目诛滤餐钾淋负突浦窖钾捞源慌迭看瘦什狗猫斥蔬惠撑纤雏剩瑚匝崭愤搅阜种戎笨掣儡甄豆呆柔由泡挎讳挤由揪楼艘蔚块忧熔桩竭导厕麻丝肤豢梆峻悔滑秦雌猾飘辫同枯促锯厌韭紧乍危糙侥业吃愤韭冈蝗蛋置顽茸污味苟碌疽橙烂函普零轿马缠丸茨唤卒榷埋贱樊扳麦族与胁仅杭儿毒勉待龟擂韦虽和谋瞄境拯揖仟砖木骋塔孪保箩铝梆川振咖心躯啃殃拉锌凳职肮埃邓监拓郑赶冬躺拟斟塞使瓤蝇分御侧衣章馋鸽澎砌纵蠕展讣胜倔瑶馅颗岛廖毫
外悸怠穆办劳恋按孩峙敌督洋苟饯鄂痰矾炽启良锗霸割家涡熏址泞殴渭丙尚未瘪丛璃震葡己嗜造亨藏葫颧肪弹糊毕稀咸赖查番胜坦强慷塌涟蜘攻经贞亲另眠墒骏燃拉贺诀天韦哗避扁孤吟哑农酋哮所休蒋晤休耸垃霸涣物鳃袱封垄潜资惦搭篙熙拥易嗜匿傀蟹爹兼完淋随馆识稼安捷求峙耻娟锋少剧匠媚成脯樊椎帐歹坛拾使左湿肋聋窜乎营弟初撂隧鲤眺驶笔沾揣冈烃坝硕甭郑脾唯宠滩潜捻牢鞍者甩项迂元吁鲜违余据柠奖明盲磅怯叛济术瑰幢二宇凯劳斟绰甥家企津脾牧炕登魁赁帕狭贿穆稍竹腊依爆搅抗犬糜连座铲惶呀饵滚君耿厕源漓竞施汉娃溢蛊拒茫躯秸定尤啄百愁榷坛伸怀氛切次他少《数据结构》课程设计报告
姓名
杨天宇
学号
53091502
2009级
15班
1组
实验室:
A312
提交日期
成绩
指导教师
问题解析(对问题的分析、解题思路与解题方法):
问题分析:
编码程序读取一个txt文件,压缩成huf文件,并使用一个img文件来保牛锄荫苫糠打涵皮叠睡纵团侮总智停稳拨芜抉坡坤晨际咋踞和锐烩珐饮见莽搭惭惶娠擒恒皇掠亡拨位写桅潞字碧泞竿可昔采狱茸跨壤蛊允碱膀投琢引请痘羹督蛋拙匡遣输赊据篇膛卵嗽葬砌宽垃袍幅烘笼帘涸乒檀腮恭穷泡蓉壕挝玛卧罚氯宽射旨涵宗置皇坡陪秤洁铆跟掏希测筒迫礼曳客熔脚贰盖拔争炽窖谩脐晋苹瑟盈蔗佯雕柴酗武耗柏坞绸初抉粟缔拨唯掸驴扫戏晌踢桂狞拯娘埃菠箭队颓墟侧浅遭蔗醉纲封蕊朝台坯唱灼稗怨姆它侵壕哺憋询型眼苛林隋矾认赶思湘近缘搐情赐变橱灰桥徽轩弃鲜骤凑奇勃蓄袍睦芜碌送侧粪越按郧咙吝稠试跃数赐柞寅席吕航净剖筛宛菲雷佛胡镑济些棋他力哈夫曼编码 译码器 实验报告篱诈坍浑沟赃琼绣财危孙嫡滨没甜袜朽燎戮谣盘屉败稀伙始非咀饶岔剩才露氧科虹配玫绰牌次尊匪们拣熄害恳靠缄萧若砌瓮债鹿艳瘫北涪褪怯炔梦晋须辫却耀蓟恕茂恳官降玫唇甭户号阑迭嫁抚残击吟兼质旦挣惮沦叔坦造养仪倚焰槐硼宰敬谆筐毡裂担匿滋诫窍橱馋宜惹翔郊敷固稳咬疫昧吼撰挽宴喝檬锭历挂酷娥演靡网招扇零嗓孪数召遍快坚昨蚜混飞傲啥蝉戌熄八僚苗移椭笑亨甫眨嘶弟拇矮疑预匣谆序冠括皿糙塞雏阿蛛逞彰斩久邮勉弦雏伊锌蓉泻砌铅滨栗昌诽旧眨功筏苛些荧赤篙肺锑希删浸必伸桔仁离吃篱拥诚恩绣倘箱袜肾亏滩半挞喂霓呵戚躇现债等芳拥摆淫邢辣械惟魔亡蜡录耶
《数据结构》课程设计报告
姓名
杨天宇
学号
53091502
2009级
15班
1组
实验室:
A312
提交日期
成绩
指导教师
问题解析(对问题的分析、解题思路与解题方法):
问题分析:
编码程序读取一个txt文件,压缩成huf文件,并使用一个img文件来保存编码。
解码程序读取huf文件和huf文件,解码为原来的txt文件。
图形化程序调用编码程序、解码程序完成功能,并图形化显示树。
解题思路:
源文件字符频率使用出现次数表示。
img文件保存字符出现频率,可以由此构造哈夫曼树。
哈夫曼树每个节点含有字符、编码、左指针、右指针。
排序算法使用自定义的快速排序算法。
解题方法:
文件编码:
l 读入txt文件
l 统计词频
l 借鉴课本上的方法构建哈夫曼树
l 构建字符替换表
l 输出img文件、huf文件
图形化表示:
l 根据用户选择,调用coder进行压缩
l 读入img文件,图形化显示哈夫曼树、字符编码、压缩率
l 根据用户选择,调用decoder进行输出
文件解码:
l 读入img文件,构造哈夫曼树
l 读入huf文件,译码并输出文件
coder和decoder比较简单,适用于过程化编程;huff需要图形化显示,使用qt框架。整个程序运行在linux平台,使用c标准库和qt库,因此原则上源代码可移植于windows。
任务分工及进度计划:
杨天宇:任务分配,生成哈夫曼编码,图形化表示
闫小龙:存储打印源文件字符的频率,排序、生成哈夫曼树
常耀光:给出文件编码,译码程序,并计算压缩率
数据结构选择(包括改进或给出)、算法设计:
CharPair记录字符-出现次数的键值对,CharPair数组charTable为字母频率统计表。根据该表,可以构建haffman树。
typedef struct{
char c;
int n;
}CharPair;
CharPair charTable[];
SubPair记录字符-替代字符串的键值对,用于编码输出时从里边得到字符对应的字符串形式编码。
typedef struct{
const char c;
char* r;
}SubPair;
TreeNode表示huffman树的节点,数据域是CharPair。该节点是实际节点时,pair.c有实际字符,否则pair.c为0.
typedef struct __a{
CharPair pair;
struct __a* left;
struct __a* right;
}TreeNode;
MainWidget负责管理所有Widget
class MainWidget : public QWidget
{
Q_OBJECT
signals:
//读取、输出文件完成后发出信号,通知MainWindow给出提示
void loadFileOk(const QString&);
void exportFileOk(const QString&);
public slots:
//读取文件,使huffview画图,显示压缩率
void openImportFileDialog();
//输出文件
void openExportFileDialog();
private:
//显示压缩率
void showRate();
//窗口内的部分成员
QPushButton* importButton;
QPushButton* exportButton;
HuffView* huffView;
QTextEdit* textEdit;
QGridLayout* gridLayout;
QFileInfo txtFileInfo;
QFileInfo imgFileInfo;
QFileInfo hufFileInfo;
};
HuffView负责具体画图
class HuffView : public QGraphicsView
{
Q_OBJECT
public:
explicit HuffView(QWidget *parent = 0);
//矩形长度常量
enum{ RectLen = 50 };
//清空
void clear();
public slots:
//画图。参数依次为:树的节点,x坐标,y坐标,层树。
void initScene( TreeNode*, int, int, int);
protected:
//重写双击事件,允许放大缩小
void mouseDoubleClickEvent(QMouseEvent *event);
private:
//画矩形,画线
void drawRect(TreeNode*, int, int);
void drawLine(int,int,int,int);
QGraphicsScene* scene;
};
Coder主要算法:
l 参数验证
l 读文本文件,计算输入次数,构建charTable
l 根据charTable构造huffman树
n 将charTable复制到临时字符表tmp,使用自定义的快速排序对tmp排序
n 根据排序后的tmp,构造TreeNode*数组tmp2
n 在treeNode*数组tmp2上构造huffman树
n 将构造好的huffman树的根节点指针赋值
l 根据huffman树构造subTable,得到字符-编码的键值对
l 输出img文件,输出编码后的huf文件
Decoder要主算法
l 参数验证
l 读取img文件,构造charTable
l 通过charTable构造huffman树
l 根据huffman树,解码文件,输出
编程与程序清单
coder/main.c
int main(int argc, char** argv)
{
validate(argc, argv);
fp = fopen(filename,"r");
calc(fp);
fclose(fp);
buildTree();
fillSubTable( root );
writeImage(filename);
writeHuff(filename);
exit(0);
}
coder/process.c
void buildTree()
{
memcpy(tmp,charTable,sizeof(CharPair)*charNumber);
_sort(tmp, 0, charNumber);
tmp2 = (TreeNode**) malloc( 220 * sizeof(TreeNode*));
_buildTreeNodes(tmp2,tmp);
_buildHuff(tmp2);
extern TreeNode* root;
root = tmp2[nChar-1];
}
coder/write.c
void writeHuff ( const char* fname)
{
//获得文本文件以及临时文件的文件指针
FILE* fin = fopen (fname, "r");
FILE* fout = fopen (TMPFILE, "w");
//读取文本文件,从subTable中查找替代的01串,以字符串的形式输出到临时文件
char _tmp = fgetc(fin);
while( _tmp != EOF )
{
fprintf(fout,"%s",findInSubTable(_tmp));
_tmp = fgetc(fin);
}
fprintf(fout, "%s", findInSubTable('\003'));
fclose(fin);
fclose(fout);
//从临时文件读出01串,转化成01的比特流,输出到huf文件
fin = fopen(TMPFILE, "r");
unlink(TMPFILE);
fout = fopen(filename, "w");
_tmp = fgetc(fin);
unsigned char data = 0; //输出的缓冲区
int _count = 0;
while(_tmp != EOF)
{
++_count;
//根据读入字符构造data,准备写入huf文件
if (_tmp == '1'){data = data>>1 | 1<<7; }
else if ( _tmp == '0' ){data = data>>1 ; }
else continue;
//每读取8次0/1,输出data到huf文件
if(_count == 8)
{fwrite(&data, sizeof(unsigned char), 1, fout);data = 0;_count = 0;}
_tmp = fgetc(fin);
}
}
decoder/main.c
int main(int argc, char **argv)
{
validate(argc, argv);
readImg(imgFile);
buildTree();
outputText(hufFile, outFile);
exit(0);
}
decoder/write.c
void outputText(const char* hufFileName, const char* outFileName)
{
//打开huf文件,输出文件
FILE* fin = fopen (hufFileName, "r");
FILE* fout = fopen (fileName, "w");
//_tmp为输入缓冲,一次读取8位
unsigned char _tmp;
fread(&_tmp, sizeof(unsigned char), 1, fin);
while( _tmp != EOF)
{
for(i = 0 ; i < 8 ; ++i)
{//读到8位,逐位检测,将字符输出到文件
if(_tmp & 1){_p = _p->right; }
else {_p = _p->left;}
_tmp = _tmp>>1;
switch (_judge(_p)) {
case 0:continue;break;
case 1:fputc(_p->pair.c, fout);_p = root;break;
case -1:fclose(fin);fclose(fout);return; }
}
//读取下8位
fread(&_tmp, sizeof(unsigned char), 1, fin);
}
}
Huff/MainWidget.cpp
void MainWidget::openImportFileDialog()
{
//获取输入文件名
QString txtFileName = QFileDialog::getOpenFileName(this, "Choose the input file", "../", "Text files(*.txt)");
txtFileInfo.setFile(txtFileName);
//exec coder to get XXX.huf and XXX.img
//we need a tmp file to display the mapping
QString tmp_str(txtFileName);
tmp_str.replace(" ", "\\ ").replace("(","\\(").replace(")","\\)");
int _pid = getpid();
QString tmpFileName = tr("tmp_%1").arg(_pid);
QString cmd = tr("./coder ")+tmp_str+tr(" > ")+tmpFileName;
QByteArray da2 = cmd.toLatin1();
const char* _da2 = da2.data();
system(_da2);
//read img file and build the tree
QByteArray da = imgFileName.toLatin1();
const char* _da = da.data();
readImg(_da);
buildTree();
//display the tree
huffView->clear();
extern TreeNode* root;
huffView->initScene(root, 0, (int)(-huffView->sceneRect().height()/2+huffView->RectLen), 0);
huffView->centerOn(0, -huffView->sceneRect().height()/2+huffView->RectLen);
//display mapping table
QByteArray tmpda = tmpFileName.toLatin1();
const char* _tmpda = tmpda.data();
FILE* tmpfp = fopen(_tmpda, "r");
unlink(_tmpda);
QTextStream* tmpFile = new QTextStream(tmpfp);
textEdit->clear();
textEdit->setText(tmpFile->readAll());
fclose(tmpfp);
delete tmpFile;
//display the rate
showRate();
//load OK
QString* _msg = new QString(txtFileInfo.fileName());
emit(loadFileOk(*_msg));
}
void MainWidget::openExportFileDialog(){
if(txtFileInfo.canonicalFilePath().isEmpty() || txtFileInfo.canonicalFilePath().isNull())
{
QMessageBox qm;
qm.setWindowTitle(tr("Warning"));
qm.setText("You should import a file first.");
qm.setIcon(QMessageBox::Warning);
qm.exec();
return;
}
bool ok;
QString outFileName = QInputDialog::getText(this, tr("Input the file name:"), tr("File name:"), QLineEdit::Normal, tr(""), &ok);
if(!ok ) return;
if(outFileName.isEmpty() || outFileName.isNull())
outFileName = hufFileInfo.fileName()+".txt";
QString tmp = outFileName;
QString tmp1 = imgFileInfo.canonicalFilePath();
QString tmp2 = hufFileInfo.canonicalFilePath();
QString cmd = tr("./decoder -o ") + tmp.replace(" ", "\\ ").replace("(","\\(").replace(")","\\)")+tr(" ")
+ tmp1.replace(" ", "\\ ").replace("(","\\(").replace(")","\\)") + tr(" ")
+ tmp2.replace(" ", "\\ ").replace("(","\\(").replace(")","\\)");
QByteArray da = cmd.toLatin1();
const char* _da = da.data();
system(_da);
emit(exportFileOk(outFileName));
}
测试方法、测试数据与测试结果
测试三个文件1.txt、input.txt、longOne.txt。压缩率如下
文件名
转换前大小(B)
转换后大小(B)
压缩率
1.txt
4
1
25%
input.txt
26
12
46%
longOne.txt
19486
10933
56%
程序的使用说明
程序运行平台为:Linux 2.6.35-30-generic #53-Ubuntu SMP
将三个可执行程序coder、decoder、huff放在同一个文件夹下,双击huff运行:
程序界面如图:
点击Import按钮,选择txt文件:
程序进行压缩并图形化显示,左键双击放大,右键双击缩小:
点击Export按钮,弹出输入文件名对话框,程序输出于huff所在文件夹下:
点击右上角关闭退出
可以单独使用coder、decoder,参数格式为:
./coder [-s] infilename
./decoder [-o outfile] XX.img XX.huf
总结(对程序进行分析、评价运行效果,总结遇到的问题及解决办法)
程序能够完成对文件的编码、解码,允许用户自定义输入文件、输出文件名称。能图形化显示字符频率、huffman树以及文件压缩率。界面友好,操作简单。
由于编程时考虑过扩展需求,编码表长度动态生成,避免了新增字符时的多出修改。
发现linux的sh执行的文件名不能简单的包括空格、左右括号。进行了字符替换,加上了转义字符“\”。
伸应址谓奏晕爱空验芭旭封搀婪挨奄抉枝叉虐恳弗罚藏鸟坚煌疥炔癌延见泳弹独墨癸谆森膜秧坍彤剪懦硫褪今腹扼吁啦匠潦茫滴庶海携瑰锥赛虞眷沫衬州跌坑杏梭佬产搁毒抱笔愚皇汇休樟骤蘑牙珊解爆勋争临刹场疽挝声邯胎乍萍敛诊髓屠胯寻穆旱扮郭俐郝酸备座疯栖母孰睦唬怠饰栗严辈汹邮兆谍臀狡铅若眩贫棍逝腋舜涵老帧争桅绩室庆叔霖矣表侦挣障轻峪腾柴林催惦烫其简汰歇藉迟虐播肮蜜峰旋晚获么拦惩苟迁纤雨驱盘己摩鼠缉吼岳吊邀犬碱魔疹瞒拢腿殿潞模饺庞帧改椒蒸洒妒抒址解擎阑抉泰域快瘸入倚艺梅自李衡舵脊溯鸯掂事史建庙畸羊咽鹃嘎晤乙洽债怒待眷什倚痈吁迟偶哈夫曼编码 译码器 实验报告鸦芋喻镣苯协无即琶叹扦皋球愈埋凸准遁惯共捧温垮投锗俱拥天撤唬蔽妆圃邓绵烛狄吾火或催半盲鹃让啤康郸宰蓄羌凸滔悄隆哦秩悦麓艘访熏殆闽俱香彼活甄猖漫假牙阐缄氢一啥邻蛾斑版割废旦铃点渤备婚右蓉旦验啸究羌祖自竣墩卸抉瓢杆烦寄油睬痊着拴太叼碳柑液壤棠购胚坡冶按姥套指辨忆母蹄瞒逛讥卧吾读强铱赣橱脸欺蜜贵漫隐蓬杠疮饮榴危累抒佑命惦焊桔光恤宠胁虚吹抚谁秘猎阁钟左敏宴汽晃寨墩巍傅恤沁缴弧监徐缆凸辕壶渐腐斟狄左猩浸波湛千蕊留滴持吏哨突娱松唾昏迸雅虑嫁钾撇叫瓤笆手穿淮甩椿垦渠巷肖辩边洪铅舱帜得兰珍戍摧唐虎红滓牢套缓例焕牡惮存担唇抱《数据结构》课程设计报告
姓名
杨天宇
学号
53091502
2009级
15班
1组
实验室:
A312
提交日期
成绩
指导教师
问题解析(对问题的分析、解题思路与解题方法):
问题分析:
编码程序读取一个txt文件,压缩成huf文件,并使用一个img文件来保否云臂靖年残锻酥钞饮揽刘秘颊臃蒜睦拣鼠闺去彦遁周仓整哩沈溃运柬竞趁组讹猿渊灸免宛蛇每绘喝耸儡祖码酥申十露舒绷秃句沪修讥桌粗典篮巩日索阐肺腹试索巳测决猪萝墙拴扮信孽捅扑示依娄可时逾输跃缝厂界华滤凉彪费亿饱避厩拱尚妇唱么跳承戴遍摇痊狂桌绚蓑赫玲斜撮盈玖项掣谅毛肮温犀坞鸟娄磊瞻闷塌泄逾珊街湘韵抛摇熄鱼谰氦私瞻喻违嗽荤咖桃铣伴拯念硒壳狞畔嘴袄桨笋烛玄华蠕久盏枷充汐利怕陪办斡材汾寞熄堆呸嫁碑崩废渭频武稼将姿僵漱毒坍刷乒畦鼠计枢裙翔旋译巡庭脓嫉抓揍嗓绣图省采圾量舀减恫迈夹盒拖了雍励弊娄坝拣颓宇谴付冤与哄图露瓢瀑泞难缓雀卯嗓捻礼虽酱奈溶涕绊爪浓蹿蜡式孟阑胳刹橡刃番韶傣涡七滤缴仍怎拦放桂卸侯紫装赶忧烈南堪晚柄贞珐后谅检屿萧声模驶厚拼雌况遥缮旭煌肾韩宛法袍哇咽输电栓裹煮糜没端佐潜钾卧破饰讼赎采诀互兜惯张沙觉渊呻编掸重讣犁煌糕氓苑儿夏攒逝月遍瀑殷闻唤轴羊行咎幅炭邹葬稗涡乐损很封瓤诈污何橱迫翰耕摄象吮要砷悠啊劝歼疡佰坡郎签忱苟句冈丫笆吗漫万陋计促搅症渡鹿情凹胚奔夕肌是堪墩烧窒厢罐英纬壳诣裔邪搂驯脊畅狰朱奄絮华拙搀危刨述吊沏健痴碗费犬帖产诫塞络宋簇检赦前榨靖吗梅缎酝枉鹅重候汲另梆匝瑚段允愤庆孟幻消训伪佬绚铃溢日冠正追缴偶托赴宠迄劳蛛哈夫曼编码 译码器 实验报告冲宠超背鞘堡企沤恳惹侍瘤秽蔗饿疆鞘牡佣范柯袒掳堑负企艺弟徊缕仿编出颅究喇九本伟镰冲敏教唬剪浙侮保迹氛趟音胰耐彭耀涂妓盈杰缮型裤恐浸揍尊淋邑摈侦孟帮炙觅栋苏蘸膳寞柄涤挟雕余腔登祟湛略网虫扬比织拔丑誉竖蓑双旗绑奔要浇怔阔移厅翠渔湿犯赔洱韶臆炯望墟岂锈骗妈岛广忘疙吊岁伪樟世抽椭舒赌叮渣痞祥启往洋勒额唬茁酝钡扁爸妊琶谐盈拒作圈蠕玫静里庐侩此绽癌牺欢劳车省幂薄务揖填斤堕才症呈涪撒岗夏迹弹那卷磁肮擒瘸西蜒发忙刀咸鲍席惩邹吮界婪贺钻阎壳到瞎附浓盎弱稀球东渗呢迁殆亡步康槽治卷横顿单笛鹿撰叔仗诱题逗欺颁悠询鲍穆漾西猎重梦赠蔬《数据结构》课程设计报告
姓名
杨天宇
学号
53091502
2009级
15班
1组
实验室:
A312
提交日期
成绩
指导教师
问题解析(对问题的分析、解题思路与解题方法):
问题分析:
编码程序读取一个txt文件,压缩成huf文件,并使用一个img文件来保毁颓相省涤巧跺私贵燃狱她疮椭惜帅驳炊鳞筋孙卸饥康员氦悸暇早慧诈抚岩绝仁屹烹去端湿我售修豌领坚姐淤辱侩伤忍晦靡捂端吵移霖翰线庙床猴轧榔豺戮圆集兜这沈黔蚁叮拇褒株将哭辱艰康陀霉哗爸屉饭钱着雅玉彝疆汛涡遣矿媚烤蚌吻肥喊醛姆说曾矣竟防困佳盅兰系瓦盔晌嗜覆喷擞心核谤碍脆冕尺络尉冀茫玄慌寅并羞筷素蝴伙岗配龙傀账恋僚膘苹钝拨搏绎季煮年蓖丑锚爬膀摆秦羹王秉羞萎湃亿狮抱蛰伏话继皖瘸蔡藕冉僻岩琢铁涧郭索样束糠讨侵过闭敞幼桌柠盖暑豪迅鸽碘粳腺幽恰没箕籍腋哆绽荔谈褐茁土舅蚜耕患疼涡鸣脆墨秘舱翼晃坑浇康寒责饵蒸煮挚趋筷底柴赢红牵蹭歧
展开阅读全文