我自己修改了一个HUFFMAN编码的C程序,执行通过,无任何错误。“搬”到MFC,用Edit接收字符串,再编码,可以执行,结果也正确,可是,系统提示有内存错误。请问,怎么解决????平台:Win2000 Server
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>struct HTNode
{
int weight;
int parent;
int lChild;
int rChild;
};
HTNode* HT;
int LookFor(char letter,int count);
void GetWeight();
void HuffmanCoding();
void Select(int step);
char* Data="abbcccddddeeeee12121212121fsdfdfsaddsadsdsewrewrewewrewew";
int Length=0;
int AllCount=0;
char* Letter="";
int* LetterCount;
char** HC;
char* Code="";
int s1=0;
int s2=0;void main()
{
GetWeight();
HuffmanCoding();
//Translate();
printf("index letter weight parent lchild rchild code\n");
for(int i=1;i<=AllCount;i++)
{
printf("%d %c %d %d %d %d %s\n",i,Letter[i-1],HT[i].weight,HT[i].parent,HT[i].lChild,HT[i].rChild,HC[i]);
}
}void GetWeight()
{
Length=strlen(Data);
Letter=(char*)malloc(Length);
LetterCount=(int*)malloc(Length);
int Index;
for(int i=0;i<Length;i++)
{
if(i==0)
{
Letter[0]=Data[i];
LetterCount[0]=1;
AllCount++;
}
else
{
Index=LookFor(Data[i],AllCount);
if(Index==-1)
{
Letter[AllCount]=Data[i];
LetterCount[AllCount]=1;
AllCount++;
}
else
{
LetterCount[Index]++;
}
}
}
Letter[AllCount]='\0';
}int LookFor(char letter,int count)
{
for(int i=0;i<count;i++)
{
if(Letter[i]==letter)
return i;
}
return -1;
}void HuffmanCoding()
{
if(AllCount<=1) return;
HT=(HTNode*)malloc((2*AllCount)*sizeof(HTNode*));
HT[0].weight=0;
HT[0].lChild=0;
HT[0].rChild=0;
HT[0].parent=0;
for(int i=1;i<=AllCount;i++)
{
HT[i].weight=int(1000*float(LetterCount[i-1])/float(Length));
HT[i].lChild=0;
HT[i].rChild=0;
HT[i].parent=0;
}
for(i=AllCount+1;i<=2*AllCount-1;i++)
{
HT[i].weight=0;
HT[i].lChild=0;
HT[i].rChild=0;
HT[i].parent=0;
}
for(i=AllCount+1;i<=2*AllCount-1;i++)
{
//Select(i-1,&s1,&s2);
Select(i);
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;
}
//从叶子逆向遍历Huffman树
int start;
int c;
int f;
char* cd;
HC=(char**)malloc((AllCount+1)*sizeof(char*));
cd=(char*)malloc(AllCount*sizeof(char));
cd[AllCount-1]='\0';
for(i=1;i<=AllCount;++i)
{
start=AllCount-1;
for(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((AllCount-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
}
}void Select(int step)
{
int weight=9999;
int i;
if(step==AllCount+1)//如果是第一次构造,找出最小和次小
{
for(i=1;i<=AllCount;i++)
{
if(HT[i].parent==0&&HT[i].weight<=weight)
{
weight=HT[i].weight;
s1=i;//s1为最小
}
}
weight=9999;
for(i=1;i<=AllCount;i++)
{
if(i!=s1&&HT[i].parent==0&&HT[i].weight<=weight)
{
weight=HT[i].weight;
s2=i;//s2为次小
}
}
}
else //如果不是第一次构造,找剩下的最小值
{
for(i=1;i<=AllCount;i++)
{
if(HT[i].parent==0&&HT[i].weight<=weight)
{
weight=HT[i].weight;
s1=i;//s1为最小
}
}
s2=step-1;
}
}
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>struct HTNode
{
int weight;
int parent;
int lChild;
int rChild;
};
HTNode* HT;
int LookFor(char letter,int count);
void GetWeight();
void HuffmanCoding();
void Select(int step);
char* Data="abbcccddddeeeee12121212121fsdfdfsaddsadsdsewrewrewewrewew";
int Length=0;
int AllCount=0;
char* Letter="";
int* LetterCount;
char** HC;
char* Code="";
int s1=0;
int s2=0;void main()
{
GetWeight();
HuffmanCoding();
//Translate();
printf("index letter weight parent lchild rchild code\n");
for(int i=1;i<=AllCount;i++)
{
printf("%d %c %d %d %d %d %s\n",i,Letter[i-1],HT[i].weight,HT[i].parent,HT[i].lChild,HT[i].rChild,HC[i]);
}
}void GetWeight()
{
Length=strlen(Data);
Letter=(char*)malloc(Length);
LetterCount=(int*)malloc(Length);
int Index;
for(int i=0;i<Length;i++)
{
if(i==0)
{
Letter[0]=Data[i];
LetterCount[0]=1;
AllCount++;
}
else
{
Index=LookFor(Data[i],AllCount);
if(Index==-1)
{
Letter[AllCount]=Data[i];
LetterCount[AllCount]=1;
AllCount++;
}
else
{
LetterCount[Index]++;
}
}
}
Letter[AllCount]='\0';
}int LookFor(char letter,int count)
{
for(int i=0;i<count;i++)
{
if(Letter[i]==letter)
return i;
}
return -1;
}void HuffmanCoding()
{
if(AllCount<=1) return;
HT=(HTNode*)malloc((2*AllCount)*sizeof(HTNode*));
HT[0].weight=0;
HT[0].lChild=0;
HT[0].rChild=0;
HT[0].parent=0;
for(int i=1;i<=AllCount;i++)
{
HT[i].weight=int(1000*float(LetterCount[i-1])/float(Length));
HT[i].lChild=0;
HT[i].rChild=0;
HT[i].parent=0;
}
for(i=AllCount+1;i<=2*AllCount-1;i++)
{
HT[i].weight=0;
HT[i].lChild=0;
HT[i].rChild=0;
HT[i].parent=0;
}
for(i=AllCount+1;i<=2*AllCount-1;i++)
{
//Select(i-1,&s1,&s2);
Select(i);
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;
}
//从叶子逆向遍历Huffman树
int start;
int c;
int f;
char* cd;
HC=(char**)malloc((AllCount+1)*sizeof(char*));
cd=(char*)malloc(AllCount*sizeof(char));
cd[AllCount-1]='\0';
for(i=1;i<=AllCount;++i)
{
start=AllCount-1;
for(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((AllCount-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
}
}void Select(int step)
{
int weight=9999;
int i;
if(step==AllCount+1)//如果是第一次构造,找出最小和次小
{
for(i=1;i<=AllCount;i++)
{
if(HT[i].parent==0&&HT[i].weight<=weight)
{
weight=HT[i].weight;
s1=i;//s1为最小
}
}
weight=9999;
for(i=1;i<=AllCount;i++)
{
if(i!=s1&&HT[i].parent==0&&HT[i].weight<=weight)
{
weight=HT[i].weight;
s2=i;//s2为次小
}
}
}
else //如果不是第一次构造,找剩下的最小值
{
for(i=1;i<=AllCount;i++)
{
if(HT[i].parent==0&&HT[i].weight<=weight)
{
weight=HT[i].weight;
s1=i;//s1为最小
}
}
s2=step-1;
}
}
解决方案 »
- CVS问题,高手进!
- 请教:如何判断程序运行过程中一段时间内没有键盘和鼠标的操作。
- 程序界面变形调整
- “a control with this id already exist.Enter a unique control id”?
- 如何格式化时间20061212成2006-12-12
- 四、 用Visual C++6.0编写一单文档应用程序,编写代码实现运行时左右并列显示三个视图,左视图和中间视图的宽度均为200,在三个视图中均
- 请问大家大文件如何传送啊&^_^
- 100分求助在VC中操作word的问题
- 急问 播放flash
- 如何在VC++中建立如同VB中的控件数组?
- 菜鸟问题
- 诚心拜师:我在看ftp协议,有些命令不懂,谁可以做我师傅啊
{
if(AllCount<=1) return;
HT=(HTNode*)malloc((2*AllCount)*sizeof(HTNode*));
......其中"HT=(HTNode*)malloc((2*AllCount)*sizeof(HTNode*))"
怎么是"sizeof(HTNode*)"?
应当是HT=(HTNode*)malloc((2*AllCount)*sizeof(HTNode))"吧?
楼上是对的