Haffman.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
typedef struct HaffmanTreeNode
{
int weight;
int parent,lch,rch;
}HaffmanTreeNode, * HaffmanTree;
void CreateHaffmanTree(HaffmanTree *tree, int n);
void Selcct(HaffmanTree tree, int arr, int* s1, int* s2);
void printHaffman(HaffmanTree tree,int n);
Haffman.c
#define _CRT_SECURE_NO_WARNINGS
#pragma warning (disable:6386)
#include "Haffman.h"
void CreateHaffmanTree(HaffmanTree *tree, int n)
{
int m = 0;
if (n <= 1)
{
return;
}
m = 2 * n - 1;
*tree = (HaffmanTree)malloc((m + 1) * sizeof(HaffmanTreeNode));
if (!(*tree))
{
return;
}
for (int i = 0; i <= m; i++)
{
(*tree)[i].lch = 0;
(*tree)[i].rch = 0;
(*tree)[i].parent = 0;
(*tree)[i].weight = 0;
}
printf("请输入带权结点权值!!!\n");
for (int i = 1; i <= n; i++)
{
int n = scanf("%d", &((*tree)[i].weight));
}
//初始化成功,下面开始建哈夫曼树
int s1 = 0, s2 = 0;
for (int i = n + 1; i <= m; ++i)
{
Selcct(*tree, i - 1, &s1, &s2);
(*tree)[s1].parent = i;
(*tree)[s2].parent = i;
//警告C6386:写入 "*tree" 时缓冲区溢出。
(*tree)[i].lch = s1;
(*tree)[i].rch = s2;
(*tree)[i].weight = (*tree)[s1].weight + (*tree)[s2].weight;
}
}
void Selcct(HaffmanTree tree, int arr, int *s1, int *s2)
{
if (!tree)
{
return;
}
int k = 1;
while (tree[k].parent != 0)
{
k++;
}
int temp1 = tree[k].weight;
*s1 = k;
for (int i = k + 1; i <= arr; i++)
{
if (temp1 > tree[i].weight && tree[i].parent == 0)
{
temp1 = tree[i].weight;
*s1 = i;
}
}
while (tree[k].parent != 0 || k == *s1)
{
k++;
}
int temp2 = tree[k].weight;
*s2 = k;
for (int j = k + 1; j <= arr; j++)
{
if (temp2 > tree[j].weight && tree[j].parent == 0 && j != *s1)
{
temp2 = tree[j].weight;
*s2 = j;
}
}
}
void printHaffman(HaffmanTree tree,int n)
{
for (int i = 1; i <= 2 * n - 1; i++)
{
printf("第%d个结点权重:%d,双亲:%d,左孩子:%d,右孩子:%d\n",
i, tree[i].weight, tree[i].parent, tree[i].lch, tree[i].rch);
}
}
关于警告6386我找不到问题,请各位猿友解惑?
main.c测试
int main(int argc, char* argv[])
{
HaffmanTree tree = NULL;
CreateHaffmanTree(&tree, 8);
printHaffman(tree, 8);
system("pause");
return 0;
}