主题:[讨论]求助:用C++语言编写“哈夫曼编码和译码”,大哥哥大姐姐帮忙回个帖啊~~~
xiaolan
[专家分:0] 发布于 2006-06-11 11:31:00
求助:用C++语言编写“哈夫曼编码和译码”,大哥哥大姐姐帮忙回个帖啊~~~
回复列表 (共3个回复)
沙发
wwsq5573 [专家分:250] 发布于 2006-06-12 17:51:00
我这里有一个自编的,可以参考一下
板凳
wwsq5573 [专家分:250] 发布于 2006-06-12 17:51:00
#include<stdio.h>
typedef struct{
int weight;
int parent,lchild,rchild;
int mark;/* mark为标记符,标记是否有比较,若没比较则值为0,否则为1 */
}htnode,*huffmantree;
typedef struct huffcode{
int *code;
}huffcode,*huffmancode;
/* ------------定义栈的结构体------------- */
typedef struct{
int *base;
int *top;
int stacksize;}sqstack;
/* -----------栈的初始化----------------- */
initstack(sqstack *s)
{
s->base=(int *)malloc(100*sizeof(int));
if(!s->base)
exit();
s->top=s->base;
s->stacksize=100;
}
/* ------------求当前栈的长度----------- */
int length(sqstack *s)
{
return s->top-s->base;
}
/* --------------把元素e压入栈中------------------ */
push(sqstack *s,int e)
{
if(length(s)>=s->stacksize)
{
s->base=(int *)realloc(s->base,(s->stacksize+10)*sizeof(int));
if(!s->base) exit();
s->top=s->base+s->stacksize;
/* 为下一次插入作准备,下一次插入的时候不会出现错误追加空间 */
s->stacksize+=10;
}
*s->top=e;
s->top++;
}
/* -----------弹出当前栈顶元素------------- */
int pop(sqstack *s)
{
int e;
if(s->top==s->base) exit();
e=*(--s->top);
return e;
}
3 楼
wwsq5573 [专家分:250] 发布于 2006-06-12 17:52:00
/*-----创建一个赫夫曼树并求它的赫夫曼编码且打印出来----*/
void createhuffman(huffmantree huff)
{
int *weight;
int i,j,k=1,m,n,temp,x;/* m,n为赫夫曼树中两个权植最小的结点 */
unsigned int tempa,tempb;/* 比较大小的中间变量 */
sqstack *hc;/* 定义栈存放赫夫曼码 */
printf("How many does the huffman's leaves?Please input a number:");
scanf("%d",&n);
weight=(int *)malloc(n*sizeof(int));/* 存放权值的数组 */
/* ----------输入权值-------------- */
for(j=1;j<=n;j++)
{
printf("please input the %d weight:",j);
scanf("%d",&*(weight+j-1));
}/* for */
huff=(huffmantree)malloc((2*n)*sizeof(htnode));/* 分配结点空间,0结点不用 */
if(!huff)exit();
/* ------------赫夫曼树初始化及生成所给权值叶子的双亲------- */
for(i=1;i<=n;i++)
{
huff[i].weight=*(weight+i-1);
huff[i].lchild=huff[i].rchild=huff[i].parent=0;
huff[i].mark=0;/* 给叶子初始化 */
}/* for */
for(i=n+1;i<=(2*n-1);i++)
{
huff[i].weight=huff[i].lchild=huff[i].rchild=huff[i].parent=0;
huff[i].mark=0;/* 给非叶子初始化 */
}/* for */
for(j=n+1;j<=(2*n-1);j++)
{/* -------查找第一个最小权值-------- */
while(huff[k].mark==1)
k++;/* 定位到没有比较的权值 */
tempa=huff[k].weight;/* 作下面的比较之用 */
m=k;
for(k=1;k<=j-1;k++)
if(huff[k].mark!=1)
if(tempa>huff[k].weight)
{
tempa=huff[k].weight;
m=k;
}/* if */
huff[m].mark=1;/* 标记为已比较过的 */
k=1;/* 为下一步作准备 */
/* -------查找第二个最小权值--------- */
while(huff[k].mark==1)
k++;/* 定位到没有比较的权值 */
tempb=huff[k].weight;/* 作下面的比较之用 */
x=k;
for(k=1;k<=j-1;k++)
if(huff[k].mark!=1)
if(tempb>huff[k].weight)
{
tempb=huff[k].weight;
x=k;
}/* 选择两个最小结点,分别赋给m,n */
huff[x].mark=1;/* 标记为已比较过的 */
k=1;/* 为下一步作准备 */
huff[m].parent=j;huff[x].parent=j;
huff[j].lchild=m;
huff[j].rchild=x;
huff[j].weight=tempa+tempb;
}/* for */
/* ---------打印出赫夫曼树的所有结点值--------- */
printf("number weight parent lchild rchild\n");
for(i=1;i<=(2*n-1);i++)
{
printf("%3d %8d %8d %8d %8d\n",i,huff[i].weight,huff[i].parent,huff[i].lchild,huff[i].rchild);
}
hc=(sqstack *)malloc((n)*sizeof(sqstack));/* 定义栈数组 */
for(i=0;i<n;i++)
initstack(&hc[i]);/* 栈数组初始化 */
for(i=1;i<=n;i++)
{
/* ------把逆的赫夫曼码压入栈中-------- */
m=i;
while(huff[m].parent!=0)
{
if(huff[huff[m].parent].lchild==m)
k=0;
if(huff[huff[m].parent].rchild==m)
k=1;
push(&hc[i-1],k);
m=huff[m].parent;
}/* while */
}/* for */
if(n==1)/* 若只有一个叶子则无赫夫曼码 */
printf("no huffmancode\n");
else
{
for(i=1;i<=n;i++)
{
/* -------打印出赫夫曼码--------- */
printf("the %d's huffmancode is:",huff[i].weight);
while(length(&hc[i-1])!=0)
{
/* m=pop(&hc[i-1]); */
printf("%d",pop(&hc[i-1]));
}/* while */
printf("\n");
}/* for */
}/* else */
}/* createfuffman */
void main()
{
htnode h;
createhuffman(&h);
getch();
}
我来回复