您的位置:首页 > 理论基础 > 数据结构算法

数据结构总复习(2)

2013-10-10 22:51 435 查看
二叉树 基本操作

#include<stdio.h>
#include<stdlib.h>
typedef struct{
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配数组存储赫夫曼树
typedef char ** HuffmanCode;
void Select(HuffmanTree HT,int i,int &s1,int &s2)
{
int min1=100,min2=100,k,t=100;

for( k=0;k<=i;k++)
{
if(HT[k].parent==0)
{
if(t>HT[k].weight)
{
t=HT[k].weight;
min1=k;
}
}
}
t=100;
for( k=0;k<=i;k++)
{
if(HT[k].parent==0)
{
if(t>HT[k].weight)
{
if(k!=min1)
{
t=HT[k].weight;
min2=k;
}
}
}
}
s1=min1;
s2=min2;
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{
if(n<=1)
return;
int i,m,s1,s2,f;
char *cd;
HuffmanTree p;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT,i=1;i<=n;++i,++p,++w)
{

p->weight=*w;
p->parent=0;
p->lchild=0;
p->rchild=0;
}
for(;i<=m;i++,p++)
{
p->weight=0;
p->parent=0;
p->lchild=0;
p->rchild=0;
}
for(i=n;i<m;i++)
{
Select(HT,i-1,s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}

//从叶子结点到根逆向求每个字符的赫夫曼编码
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));//分配n个字符编码的头指针向量
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=0;i<n;++i)
{
int start=n-1;
for(int c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=(char *)malloc((n-start)*sizeof(char));//为第i个字符编码分配空间
HC[i]=&cd[start];//这里应该是没问题的。。。
}
free(cd);
}
int main()
{
HuffmanTree HT;
HuffmanCode HC;
int a[8]={1,2,3,4,5,6,7};
HuffmanCoding(HT,HC,a,7);
printf("%c",**HC);//怎么访问二级指针会出错。。
}


View Code
学会变通,方法各种各样,还有很多需要改进。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: