数据结构课程设计-哈夫曼树及编码Word文档格式.doc
- 文档编号:13045238
- 上传时间:2022-10-03
- 格式:DOC
- 页数:21
- 大小:283.50KB
数据结构课程设计-哈夫曼树及编码Word文档格式.doc
《数据结构课程设计-哈夫曼树及编码Word文档格式.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计-哈夫曼树及编码Word文档格式.doc(21页珍藏版)》请在冰豆网上搜索。
unsignedintparent,lchild,rchild;
//双亲,左孩子,右孩子
}HTNode,*HuffmanTree;
typedefchar**HuffmanCode;
所设计的函数如下:
intmin(HuffmanTreeHT,inti)找出所有权值中最小的那个。
voidSelect(HuffmanTreeHT,inti,int&
s1,int&
s2)找出每次最小的两个权值最小的权值。
StatusHuffmanCoding(HuffmanTree&
HT,HuffmanCode&
HC,int*w,intn)
构造赫夫曼树并构造每个字母的赫夫曼编码。
voidPrintHT(HuffmanTreeHT,intn)
输出赫夫曼树的存储结构。
3.详细设计
intmin(HuffmanTreeHT,inti)
{intj,flag=1;
unsignedintk=10000;
for(j=1;
j<
=i;
j++)
{
if(HT[j].weight<
k&
&
HT[j].parent==0)
{
k=HT[j].weight,flag=j;
}//if
}
HT[flag].parent=1;
returnflag;
}
s2)
intj;
s1=min(HT,i);
s2=min(HT,i);
if(s1>
s2)
j=s1;
s1=s2;
s2=j;
ints1,s2,i,start,f;
char*cd;
HuffmanTreep=NULL;
//p是工作指针,指向赫夫曼树中的结点
if(n<
=1)
returnERROR;
intm=2*n-1;
//n个字符构造的赫夫曼树共有m=2*n-1个结点
printf("
->
待构造的赫夫曼树共有2×
%d-1=%d个结点\n"
n,m);
if(!
(HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode))))//申请赫夫曼树结点占用的内存空间,0号单元不用
exit(OVERFLOW);
}//if
赫夫曼树共分配了%d个结点空间,其中包含一个不用的0号单元\n"
m+1);
//printf("
初始化所有叶子节点的权值,父亲和孩子:
\n"
);
for(p=HT+1,i=1;
i<
=n;
++i,++p,++w)
p->
weight=*w;
parent=0;
//双亲初始值为0,表示此结点还没有被选择最小的算法选择过
lchild=0;
//左右孩子初始化为0,表示空
rchild=0;
for(;
=m;
i++,p++)
weight=0;
for(i=n+1;
++i)
Select(HT,i-1,s1,s2);
HT[s1].parent=i;
//选出的两个权值最小的结点的双亲就是即将生成的结点
HT[s2].parent=i;
HT[i].lchild=s1;
//即将生成的结点左孩子是s1,右孩子是s2,
HT[i].rchild=s2;
//因为s1比s2先选,所以s1总是小于等于s2
HT[i].weight=HT[s1].weight+HT[s2].weight;
//即将生成结点的权值就是两个权值最小的结点的权值之和
(HC=(HuffmanCode)malloc((n+1)*sizeof(char*))))
(cd=(char*)malloc(n*sizeof(char))))
cd[n-1]='
\0'
;
for(inti=1;
start=n-1;
for(intc=i,f=HT[i].parent;
f!
=0;
c=f,f=HT[f].parent)
if(HT[f].lchild==c)
{
cd[--start]='
0'
}//if
else//叶子结点根结点的右孩子
1'
}//else
}
if(!
(HC[i]=(char*)malloc((n-start)*sizeof(char))))
exit(OVERFLOW);
strcpy(HC[i],&
cd[start]);
//printf("
叶子节点%d的赫夫曼编码为:
%s\n"
i,HC[i]);
free(cd);
returnOK;
}//HuffmanCoding
\n+-------------------------------------------------------------+\n"
|赫夫曼树HT的存储结构|\n"
+----------+----------+----------+--------------+-------------+\n"
|结点编号|weight|parent|leftchild|rightchild|\n"
i++)
printf("
|%4d|%4d|%4d|%4d|%4d|\n"
i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
for(inti=0;
len;
if(str[i]=='
A'
)
a[65]++;
elseif(str[i]=='
B'
a[66]++;
C'
a[67]++;
D'
a[68]++;
E'
a[69]++;
F'
a[70]++;
elseif(str[i]=='
G'
a[71]++;
H'
a[72]++;
I'
a[73]++;
J'
a[74]++;
K'
a[75]++;
L'
a[76]++;
M'
a[77]++;
N'
a[78]++//部分统计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 哈夫曼树 编码
![提示](https://static.bdocx.com/images/bang_tan.gif)