1、文本文件自行选择,至少含3000个字符。数据结构课程设计报告姓名陈建华学号530901192009级1班6组实验室:计算机楼A209提交日期2010.8.24成绩指导教师题目三:问题解析:运用树和线性表的数据结构知识,设计huffman编码,建立一个栈,编码 从文件中读入任意一篇英文短文(文件为ASCII编码,扩展名为txt);统计并输出不同字符在文章中出现的频率(空格、换行、标点等也按字符处理);根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码; 图形化输出哈夫曼树、哈夫曼编码;将文本文件利用哈夫曼树进行编码,存储成压缩文件(编码文件后缀名.huf)用哈夫曼编码来存储文件,并和输入文本文
2、件大小进行比较,计算文件压缩率;进行译码,将huf文件译码为ASCII编码的txt文件,与原txt文件进行比较数据结构选择、算法设计:本题采用了链表,树的数据结构。任务分工及进度计划:由陈建华同学完成编码和解码函数部分,由荣国东同学完成栈和队列的构造部分,由廖乐同学完成主函数,比较函数的调用方式。用户手册 用户输入file1.txt,当存在这个文件的时候,该程序可以将这个文件的字符(包括空格和换行)显示出来,并显示其个数,下一步,该程序希望用户建立一个文件(比如file2.txt),然后解码至file3.txt,将file1.txt和file.txt进行比较,核实是否相同。同时将file2.t
3、xt和file1.txt比较输出压缩率。,测试结果 根据题目要求的测试结果正确总结(对所作程序进行分析、评价运行效果,总结遇到的问题和解决办法)在利用数组的建立过程中,发现比较函数使用很不方便,(例如每次要减少2个节点并插入一个),利用C+中的class可以更好的解决这个问题。程序清单:#includefstreamstringmath.husing namespace std;ifstream infile1;/读原文件ofstream outfile2;ifstream infile2;/读压缩文件ofstream outfile3;ifstream infile3;/读解码后的文件ofs
4、tream outfile4;ifstream infile4;class BTNodepublic: char data; int flunt; string huff; BTNode*Left; BTNode*Right; BTNode(const char item,BTNode*Left1=NULL,BTNode*Right1=NULL):data(item),Left(Left1),Right(Right1),flunt(0) void SetLeft(BTNode*L)Left=L; void SetRight(BTNode*R)Right=R; BTNode* GetLeft()
5、return Left; BTNode* GetRight()return Right; void SetData(const int& item)data=item; char& GetData()return data; int& GetFlunt()return flunt; void SetFlunt(const int f)flunt=f;class SNode/*栈* BTNode* item; SNode* next; SNode(BTNode* t)item=t;next=NULL;class Stack SNode* top; Stack()top=NULL; void In
6、sert(BTNode* t); BTNode* Pop(); bool IsEmpty();bool Stack:IsEmpty() if(top=NULL) return true; else return false;void Stack:Insert(BTNode*t) SNode* p; p=new SNode(t); if(IsEmpty() top=p; p-next=top; top=p; BTNode* Stack:Pop() BTNode*p; SNode*q; if(top=NULL) coutitem; p=top- q=top; top=top-next; delet
7、e q; return p;Stack s;class LNodepublic:char ch;int count;bool flag;string huff;LNode* next;BTNode* root;LNode()next=NULL;LNode(char& ch1)ch=ch1;count=1;flag=0;root=NULL;class List LNode* head; LNode* current; int count; List()head=new LNode();count=0;current=head; void Insert(char& ch); void Delete
8、(); void SortInsert(LNode* pt); void Sort(); void BackSort();void List:Insert(char& ch) current-next=new LNode(ch); current=current-bool List: if(count=0) return 1; return 0;SortInsert(LNode* pt) LNode*p; LNode*p1; p1=head; p=head- while(p!=NULL&pt-countp-count)p1=p;p=p- if(p=NULL) p1-next=pt; pt-ne
9、xt=p; count+;Delete() head-next=p- count-;Sort() int min; LNode* p; LNode* q; LNode* p1; LNode* q1; LNode* temp; p=p1- while(p-next!=NULL) q1=p; q=p- while(q! if(q-count=q) temp=p- p1-next=q; p-next=q- q-next=temp; q1- q=p; p=p1- else q1=q; q=q- p1=p; p=p-BackSort()List l;List ListSearch;void transl
10、ate()/&translate& char c; while(c=infile1.get()!=EOF) p=(l.head); while(c!=p-ch&=NULL)p=p- if(p-next=NULL) if(c=p-ch)p-count=p-count+1; l.Insert(c);l.count=l.count+1; else p- l.Sort(); /*LNode*pp=new LNode(); pp-pp-ch=z; l.SortInsert(pp); l.Delete();*/ p=l.head-/ cout文件字符统计如下: coutchnext=new QNode(i
11、tem); rear=rear-BTNode *LinkQuene:OutQuene() QNode *p; p=front- BTNode *t=p-node; front- delete p; if(!front-next) rear=front; return t;int Tree:Height(BTNode *t)t)return 0; int hl,hr; hl=Height(t-GetLeft(); hr=Height(t-GetRight(); return hlhr?+hl:+hr;BTNode *Tree:Create(LNode *h)/&create tree& BTNo
12、de *p1=NULL,*p2=NULL; LNode *t1=NULL,*t2=NULL; BTNode *s;BTNode *root1; int t=l.count; while(l.count1) t1=h-t2=h-next- l.Delete();l.Delete(); if(t1-flag=0)&(t2-flag!=0) p1=new BTNode(0); p1-SetData(t1-ch);SetFlunt(t1-count);SetLeft(NULL);SetRight(NULL); p2=t2-root;=0)&flag=0) p2=new BTNode(0); p2-Se
13、tData(t2-SetFlunt(t2- p1=t1- s=new BTNode(0); s-SetFlunt(p1-GetFlunt()+p2-GetFlunt();SetLeft(p1);s-SetRight(p2);SetData(*); LNode *s1;s1=new LNode(); s1-count=p1-GetFlunt();flag=1;root=s; l.SortInsert(s1); root1=h- return root1;void BT(BTNode *a) if(a!a-GetData()huffvoid Code(BTNode* t)/*编码函数* stati
14、c string s= static int counter=0; if(t=NULL) s=s+0counter=counter+1; Code(t-counter=counter-1; s=s.erase(counter,1);1 t-huff=s;void Compress()/ p=root; if(p=NULL)return;=NULL|!s.IsEmpty()/遍历 while(p! s.Insert(p); p=p-GetLeft(); if(s.IsEmpty() return; p=s.Pop();GetLeft()=NULL&GetRight()=NULL) ListSearch.Insert(p-data); ListSearch.current-flunt;huff=p-huff;GetRight(); ListSearch.BackSort(); LNode* l;字符哈夫曼码检索表如下: l=ListSearch.head-/打印检索表 while(l!l-huf
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1