来个高手帮我改下赫夫曼树的程序!在线等~~~

ztasd6530 2009-06-16 10:52:21
这个程序在链接和编译的时候都没有错误,可是到了运行时就会弹出错误框!
来个高手帮忙看下

这是头文件 HuffmanTree.h


#define OK 1
#define ERROR 0

#include<stdio.h>
#include<string.h>
#include<malloc.h>

typedef int Status;

typedef struct{
int weight;
int parent, lchild, rchild;
}HTNode, *HuffmanTree;

typedef char **HuffmanCode;

Status Select(HuffmanTree HT, int m, int &s1, int &s2)
{
int i, min1, min2;
min1 = min2 = 32767;
s1 = s2 = -1;
for (i = 1; i <= m; ++i)
if (!HT[i].parent)
if (min1 >= HT[i].weight)
{
min2 = min1;
s2 = s1;
min1 = HT[i].weight;
s1 = i;
}
else
if (min2 >= HT[i].weight)
{
min2 = HT[i].weight;
s2 = i;
}
return OK;
}

Status HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)
{
int m, c, f, i, s1, s2, start;
char *cd;
HTNode *p;
if (n <= 1)
return ERROR;
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 + 1; 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 * sizeof(char *));
cd = (char *)malloc(n * sizeof(char));
cd[n-1] = '\0';
for (i = 0; i < n; i++)
{
start = n - 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((n - start) * sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
return OK;
}

这是主函数 main.c
#include<stdio.h>
#include"HuffmanTree.h"

void main()
{
HuffmanTree HT;
HuffmanCode HC;
int w[8] = {5, 29, 7, 8, 14, 23, 3, 11};
HuffmanCoding(HT, HC, w, 8);
}
...全文
30 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztasd6530 2009-06-17
  • 打赏
  • 举报
回复
大哥你太NX了,这程序改的真漂亮,我彻底服了
findcsdn 2009-06-17
  • 打赏
  • 举报
回复



#include <iostream>
#include <string.h>
#include <malloc.h>

using namespace std;

#define OK 1
#define ERROR 0

typedef int Status;

typedef struct
{
int weight;
int parent, lchild, rchild;
}HTNode, *HuffmanTree;

typedef char **HuffmanCode;


Status Select(HuffmanTree HT, int m, int &s1, int &s2)
{
int i, min1, min2;
min1 = min2 = 32767;
s1 = s2 = -1;
for (i=0; i<m; i++)
{
if (HT[i].parent == -1)
{
if (min1 >= HT[i].weight)
{
min2 = min1;
s2 = s1;
min1 = HT[i].weight;
s1 = i;
}
else
{
if (min2 >= HT[i].weight)
{
min2 = HT[i].weight;
s2 = i;
}
}
}
}
return OK;
}

Status HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)
{
int m, i, s1, s2;
HTNode *p;
if (n <= 1)
return ERROR;
m = 2 * n - 1;
HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));
for (p=HT, i=0; i<n; i++, p++, w++)
{
p->weight = *w;
p->parent = -1;
p->lchild = -1;
p->rchild = -1;
}
for (; i<m; i++, p++)
{
p->weight = 0;
p->parent = -1;
p->lchild = -1;
p->rchild = -1;
}
for (i=n; i<m; i++)
{
Select(HT, i, 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;
}
return OK;
}


void OutCode(HuffmanTree &HT, int leaf, int child)
{

HTNode Tmp;

if (leaf == -1)
{
cout << endl;
return;
}

Tmp = HT[leaf];
if((Tmp.lchild == -1) && (Tmp.rchild == -1))
{
cout << Tmp.weight << ":";
}
else
{
if(Tmp.lchild == child)
cout << "0";
else
cout << "1";

}
OutCode(HT, Tmp.parent, leaf);
}

void main()
{
HuffmanTree HT;
HuffmanCode HC;
int w[8] = {5, 29, 7, 8, 14, 23, 3, 11};
HuffmanCoding(HT, HC, w, 8);


for(int i=0; i<8; i++)
OutCode(HT, i, -1);
}




感觉你的节点默认值不能设置为0;



ztasd6530 2009-06-16
  • 打赏
  • 举报
回复
我把我程序上的main函数和select函数换到他的程序上 好像也没出现问题
ztasd6530 2009-06-16
  • 打赏
  • 举报
回复
我对照了 我的程序 和那个正确的程序 HuffmanCoding()都是一样的 除了他用的是C++中的new和delete分配和释放空间外就没什么区别了
ztasd6530 2009-06-16
  • 打赏
  • 举报
回复
还是有问题 min1 = HT[i].weight; 这个改了会出现错误
上山老人 2009-06-16
  • 打赏
  • 举报
回复
这样Status HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int w[], int n)
上山老人 2009-06-16
  • 打赏
  • 举报
回复
min1 = HT[i].weight; 这个使用有问题,改成HT[i]->weight
ztasd6530 2009-06-16
  • 打赏
  • 举报
回复
我从网上找了个C++的程序 他的能运行不知道为什么

#include <iostream>
using namespace std;

typedef struct
{
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;

typedef char **HuffmanCode;
typedef char *EachHuffcode;

void Select(HuffmanTree HT,int length,int &s1,int &s2)
{
//s1 lowest,s2 lower
unsigned int min = 5000;
HuffmanTree p = HT;
int i;

for(i = 1, ++p; i <= length ; ++i,++p)
{
if(p->weight < min && p->parent == 0)
{
min = p->weight;
s1 = i;
}
}

min = 5000;
p = HT;
//Get the second less weight
for(i = 1, ++p; i <= length ; ++i,++p)
{
if(p->weight < min && p->parent == 0)
{
if( i == s1)//case s1,ignore
continue;
min = p->weight;
s2 = i;
}
}

}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC, int *w,int n)
{
if(n <= 1)
return;

int m = 2 * n - 1;
HT = new HTNode[m + 1];//0 is not used

HuffmanTree p = HT;
int i;

for( i = 1, ++p; i <= n; ++i,++p,++w)
{
p->weight = *w;//NOte: never use this *p = {*w,0,0,0,0},because *p has already been declared
p->parent = p->lchild = p->rchild = 0;
}

for(; i <= m; ++i,++p)
p->weight = p->parent = p->lchild = p->rchild = 0;

int s1;
int s2;

for( i = n + 1; 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 = new EachHuffcode[n+1];//0 is not used
char *cd = new char[n];
cd[n-1] = '\0';//the end of each char
int start;

for(int i = 1; i <= n ; ++i)
{//get each huff code for h[1] to h[n]
start = n -1;
for(int c = i, int f = HT[i].parent; f != 0; c = f ,f = HT[f].parent)
if(c == HT[f].lchild) cd[--start] = '0';
else cd[--start] = '1';
HC[i] = new char[n - start];//allocate memory for each HT
strcpy(HC[i],&cd[start]);
}
delete []cd;//don't forget release memory
}

int main(int argc, char* argv[])
{
HuffmanTree hftree = NULL;
HuffmanCode hfcode = NULL;

int weight[4] = {7,5,2,4};//four node's weight

HuffmanCoding(hftree,hfcode,weight,4);

EachHuffcode *p = hfcode;

++p;
for (int i = 0; i < 4; ++i,++p)
{
cout<<*p<<endl;//show each huffman code by each line
}

for(int i = 1; i <=4; ++i)

delete hfcode[i];//release memory

delete []hfcode;
delete []hftree;

return 0;
}
ztasd6530 2009-06-16
  • 打赏
  • 举报
回复
最开始时就没用它,我是根据 严蔚敏 的数据结构书上改的
ztasd6530 2009-06-16
  • 打赏
  • 举报
回复
HT[0] 这个好像没用到
mengde007 2009-06-16
  • 打赏
  • 举报
回复
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';
}

f 什么时候为0?
ztasd6530 2009-06-16
  • 打赏
  • 举报
回复
自己顶下
ztasd6530 2009-06-16
  • 打赏
  • 举报
回复
就帮个忙运行下了 谢谢大家
ztasd6530 2009-06-16
  • 打赏
  • 举报
回复
来个高手看下哦

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧