C++ 哈弗曼编码 运行出错CXX0030: Error: expression cannot be evaluated
include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct TreeNode
{
struct TreeNode *lchild;
int element,turn;
char element0;
struct TreeNode *rchild;
struct TreeNode *parent;
struct TreeNode *next;
}Node;
Node *Min(Node *p)/*找出一个链表中的最小元素,将其删除并返回其指针*/
{
Node *min,*q,*pause;
q=p->next;/*指向第一个结点*/
min=q;
for(;q->next!=NULL;)
{
pause=q;
q=q->next;
if((min->element)>(q->element))
min=q;
}/*已找到最小结点,下一步将其删去*/
if(min==p->next)
(p->next)=(min->next);
else (pause->next)=(min->next);
return min;
}
Node *Root(Node *min1,Node *min2)/*生成新树*/
{
Node *root;
root=(Node *)malloc(sizeof(Node));
root->lchild=min1;
root->rchild=min2;
min1->parent=root;
min2->parent=root;
root->element=(min1->element)+(min2->element);
root->next=NULL;
return root;
}
Node *Last(Node *s)/*找到最后一个元素*/
{
Node *last;
last=s->next;
for(;last->next!=NULL;)
{
last=last->next;
}
return last;
}
int *PushAll(Node *Address,int *si)/*传叶节点地址和栈底,将该叶节点及其所有父亲的标志位压入堆栈,并返回此时SI指针*/
{
for(;Address!=NULL;Address=Address->parent)
{
si++;
*si=Address->turn;
}
return si;
}
void yima(int *s,Node *HNode,int mm)/*译码,传哈夫曼码数组的头地址,最优二叉树的head,编码长度m*/
{
int t,tt=1/*控制每mm个一行*/;
Node *pp;
pp=HNode->next;
for(t=0;*s!='c';t++)
{
if(*s==0)
pp=pp->lchild;
else pp=pp->rchild;
if((pp->lchild==NULL)&&(pp->rchild==NULL))
{
printf("%c\t",pp->element0);
tt++;
if(tt%mm==0)
printf("\n");
pp=HNode->next;
}
}
if((pp->lchild!=NULL)&&(pp->rchild!=NULL))
{
for(;(pp->lchild!=NULL)&&(pp->rchild!=NULL);pp=pp->lchild)
printf("%c\t",pp->element0);
}
}
void main()
{
Node *head,*Treenode,*TreenodeA[10]/*存各叶节点的地址*/,*MIN1,*MIN2,*ROOT,*LAST;
int i,j,k,num/*编码字符集大小*/,m/*字符编码长度*/,n[10]/*计字符出现个数*/,*SI,*sp,Code[10][10]/*存最后的哈弗曼码*/,huf[1000];
char a[10]/*存各字符*/,A[100][100]/*存生成的所有随机字符序列*/;
sp=(int *)malloc(10*sizeof(int));
for(i=0;i <=9;i++)
{
n[i]=0;
}
printf("请输入编码字符集大小(n <10)\n");
scanf("%d",&num);
printf("请输入字符编码长度\n");
scanf("%d",&m);
printf("请输入编码字符\n");
for(i=0;i <num;i++)
{
a[i]=getchar();
}
srand(time(0));/*生成随机字符序列*/
for(i=0;i <=99;i++)
{
for(j=0;j <m;j++)
{
k=rand()%(num-1);
switch(k)
{
case 0:{
A[i][j]=a[0];
n[0]++;
}
break;
case 1:{
A[i][j]=a[1];
n[1]++;
}
break;
case 2:
{
A[i][j]=a[2];
n[2]++;
}
break;
case 3:
{
A[i][j]=a[3];
n[3]++;
}
break;
case 4:
{
A[i][j]=a[4];
n[4]++;
}
break;
case 5:
{
A[i][j]=a[5];
n[5]++;
}
break;
case 6:
{
A[i][j]=a[6];
n[1]++;
}
break;
case 7:
{
A[i][j]=a[7];
n[7]++;
}
break;
case 8:
{
A[i][j]=a[8];
n[8]++;
}
break;
case 9:
{
A[i][j]=a[9];
n[9]++;
}
break;
}/*end of switch*/
}
}/*生成字符序列完毕*/
head=(Node*)malloc(sizeof(Node));/*生成字符大小的树*/
head->next=TreenodeA[0]=Treenode=(Node*)malloc(sizeof(Node));
Treenode->element=n[0];
Treenode->element0=a[0];
Treenode=NULL;
for(i=1;i <num;i++)
{
Treenode->next=(Node*)malloc(sizeof(Node)); // lchild CXX0030: Error: expression cannot be evaluated[/color]
TreenodeA[i]=Treenode=Treenode->next; //....
Treenode->element=n[i]; //...
Treenode->element0=n[i]; //...
Treenode->next=NULL; // ...
Treenode->parent=NULL; // CXX0030: Error: expression cannot be evaluated
}
for(;head->next->next!=NULL;)/*生成最优二叉树*/
{
MIN1=Min(head);
MIN1->turn=0;
MIN2=Min(head);
MIN2->turn=1;
ROOT=Root(MIN1,MIN2);
LAST=Last(head);
if(LAST=NULL)
head->next=ROOT;
else
LAST->next=ROOT;
}
for(k=0;num;k++)/*第零个元素记录哈弗曼码长,初始为0*/
Code[k][0]=0;
for(k=0;k <num;k++)/*将哈弗曼码存入数组Code[k][i]*/
{
SI=PushAll(TreenodeA[k],sp);
for(i=1;SI!=sp;SI--)
{
Code[k][i]=*SI;
Code[k][0]++;
}
}
for(i=0;i <num;i++)/*输出哈弗曼码*/
{
printf("%c的哈弗曼码为:",a[i]);
for(j=1;j <=Code[i][0];j++)
printf("%d",Code[i][j]);
printf("\n");
}
printf("请输入哈弗曼码,以字母c结束\n");/*译码*/
for(i=0,huf[0]=0;huf[i]!='c';i++)
scanf("%d",&huf[i]);
yima(huf,head,m);
}