哈夫曼树创建过程中的疑惑!
下面的程序当我输入完创建数据后程序自动退出,不输出创建后的数据啊,程序的后面是输入数据范例,那位师傅帮我看看怎么回事,不应该啊
#include <stdio.h> /* 输入任何一个字符查找其哈夫曼编码 */
#include <stdlib.h>
#include <conio.h>
#include <limits.h> /* 数据的使用范围 */
typedef struct
{
char data; /* 字符 */
int frequency; /* 字符频率 */
int parent, lchild, rchild; /* 分别代表双亲,左右孩子 */
}Huffman;
static void Malloc(Huffman **T, int N); /* 动态内存分配 */
static void Initial(Huffman T[], int N); /* 初始化树结构 */
static void Input(Huffman T[], int N); /* 输入树中数据 */
static void Create(Huffman T[], int N); /* 创建哈夫曼树 */
static void Select(Huffman T[], int i, int *p1, int *p2); /* 查找两个最小者 */
static void Output(Huffman T[], int N); /* 输出哈夫曼树 */
int main(void)
{
Huffman *T = NULL;
int N; /* N代表动态内存分配的数量 */
printf("Enter N: ");
scanf("%d", &N); /* N代表字符个数 */
Malloc(&T, N); /* 传递地址 */
Initial(T, N); /* 初始化树 */
Input(T, N); /* 输入树中数据 */
Create(T, N); /* 创建哈夫曼树 */
Output(T, N); /* 输出数据 */
return 0;
}
static void Malloc(Huffman **T, int N) /* 动态分配内存 */
{
if (((*T) = (Huffman*)malloc(sizeof(Huffman) * N)) == NULL)
{
printf("memory malloc failure, press any key quit.\n");
getch();
exit(1);
}
}
static void Initial(Huffman T[], int N) /* 初始化 */
{
int i;
for (i = 0; i < 2 * N - 1; i++)
{
T[i].parent = T[i].lchild = T[i].rchild = -1;
}
}
static void Input(Huffman T[], int N) /* 输入数据 */
{
int i;
printf("Enter every data: ");
for (i = 0; i < N; i++)
{
scanf("%c", &T[i].data); /* 读取字符 */
}
printf("Enter every character frequency: ");
fflush(stdin);
for (i = 0; i < N; i++)
{
scanf("%d", &T[i].frequency); /* 读取每个字符出现的频率 */
}
}
static void Create(Huffman T[], int N) /* 创建哈夫曼树 */
{
int i, p1, p2; /* p1, p2分别代表最小者和次小者 */
for (i = N; i < 2 * N - 1; i++)
{
Select(T, i, &p1, &p2); /* 查找两个字符出现频率最小者 */
T[i].lchild = p1;
T[i].rchild = p2;
T[p1].parent = T[p2].parent = i;
T[i].frequency = T[p1].frequency + T[p2].frequency;
}
}
static void Select(Huffman T[], int i, int *p1, int *p2)
{
int j, pos, min; /* 初始化最小者 */
for (j = 0, min = INT_MAX; j < i; j++) /* 找最小者 */
{
if (T[j].frequency < min && T[j].parent == -1)
{
min = T[j].frequency;
*p1 = i; /* 保存最小者下标 */
}
}
T[*p1].parent = -2;
for (j = 0, min = INT_MAX; j < i; j++) /* 查找次小者 */
{
if (T[j].frequency < min && T[j].parent == -1)
{
min = T[j].frequency;
*p1 = i;
}
}
T[*p2].parent = -2;
}
static void Output(Huffman T[], int N)
{
int i;
for (i = 0; i < N; i++) /* 输出字符 */
{
printf("%c ", T[i].data);
}
printf("\n");
for (i = 0; i < 2 * N - 1; i++)
{
printf("%d ", T[i].frequency); /* 输出频率 */
}
printf("\n");
}
#if 0
Enter N: 7
Enter every data: abcdefg
Enter every character frequency: 5 6 11 15 18 26 34
Press any key to continue...
#endif
问题点数:20、回复次数:2Top
1 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-04 20:21:28 得分 20
写的还是不错的...
自己一行一行的调试吧!!Top
2 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-04 20:28:16 得分 0
我前几天赶作业,也写了一个huffman code and encode...
在调试的过程中碰到了很多困难...
我就从程序头到程序尾一遍一遍的用cout输出信息(注:c中用printf)。哪个地方出错了,就专门看前面一部分...虽然花了很长的一段时间,但是很有收获的!Top




