#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#define Max 100
//哈夫曼树 节点
typedef struct HuffmanNode{
int weigth;//权值
struct HuffmanNode* lchild;//左子树
struct HuffmanNode* rchild;//右子树
}Huff,*pHuff;
typedef struct MinHeap{
pHuff* Node;
int size;
int max;
}MinHeap,*pMinHeap;
//初始化最小堆
pMinHeap init(int* arr,int len){
pMinHeap H=(pMinHeap)malloc(sizeof(MinHeap));
H->Node=(pHuff*)malloc(sizeof(pHuff)*len);
H->size=len;
H->max=Max;
for(int i=1;i<=len;i++){
H->Node[i]->weigth=arr[i];
H->Node[i]->lchild=NULL;
H->Node[i]->rchild=NULL;
}
return H;
}
//创建最小堆
void creat(pMinHeap H){
for(int i=H->size/2;i>=1;i--){
int parent=i;
int child=i*2;
while(child<H->size){
if(child!=H->size&&H->Node[child+1]->weigth<H->Node[child]->weigth)
child++;
if(H->Node[child]->weigth<H->Node[parent]->weigth){
pHuff hu=H->Node[child];
H->Node[child]=H->Node[parent];
H->Node[parent]=hu;
parent=child;
child=parent*2;
}
else{
break;
}
}
}
}
bool IsFull(pMinHeap H){
if(H->size==Max){
return true;
}
return false;
}
bool IsEmpty(pMinHeap H){
if(H->size==0){
return true;
}
return false;
}
//插入
void Insert(pMinHeap H,pHuff Hu){
if(IsFull(H)){
printf("堆满");
return ;
}
int i=H->size+1;
H->size=H->size+1;
for( ;H->Node[i/2]->weigth>Hu->weigth;i=i/2){
H->Node[i]=H->Node[i/2];
}
H->Node[i]=Hu;
}
//删除
pHuff Delete(pMinHeap H){
int parent,child;
pHuff Min=H->Node[1];
pHuff hu=H->Node[H->size];
H->size--;
parent=1;
child=parent*2;
while(parent*2<=H->size){
if(child!=H->size&&H->Node[child+1]->weigth<H->Node[child]->weigth)
child++;
if(H->Node[child]->weigth<hu->weigth){
H->Node[parent]= H->Node[child];
parent=child;
child=parent*2;
}
else{
break;
}
}
H->Node[parent]=hu;
return Min;
}
//先序遍历
void tra(pHuff T){
if(T!=NULL){
printf("%d ",T->weigth);
if(T->lchild!=NULL)
tra(T->lchild);
if(T->rchild!=NULL)
tra(T->rchild);
}
}
void tra1(pMinHeap H){
for(int i=1;i<=H->size;i++){
printf("%d ",H->Node[i]->weigth);
}
}
int main()
{ int arr[]={0,10,7,5,2,4};
int len=sizeof(arr)/sizeof(int)-1;
printf("111111111111111\n");
pMinHeap H=init(arr,len);
printf("2222222222222222\n");
creat(H);
//printf("33333333333333333333\n");
tra1(H);
//printf("4444444444444444\n");
pHuff T;
pHuff HU;
//printf("55555555555555555\n");
//创建树
for(int i=1;i<H->size;i++){
printf("%d\n",i);
T=(pHuff)malloc(sizeof(Huff));
HU=Delete(H);
T->lchild=HU;
HU=Delete(H);
T->lchild=HU;
T->weigth=T->lchild->weigth+T->rchild->weigth;
Insert(H,T);
}
HU=Delete(H);
T=HU;
printf("66666666666666666\n");
tra(T);
return 0;
}
为什么不对,啊,怎么改啊
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注【以下回答由 GPT 生成】
这段代码存在几个问题:
-
在
init函数中,应该给每个哈夫曼树节点分配内存空间,而不是直接访问未分配内存空间的指针。 -
在
init函数中,Max应该是一个未定义的变量,应该替换为len参数。 -
在
creat函数中,对于H->Node[child+1]->weight的访问可能会导致访问未分配内存空间的指针。 -
在
creap函数中,交换节点时,应该是交换节点指针,而不是交换节点的权值。
下面是修改后的代码:
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_LEN 100 //哈夫曼树节点 typedef struct HuffmanNode{ int weight; //权值 struct HuffmanNode* lchild; //左子树 struct HuffmanNode* rchild; //右子树 } Huff, *pHuff; typedef struct MinHeap{ pHuff Node[MAX_LEN]; int size; int max; } MinHeap, *pMinHeap; //初始化最小堆 pMinHeap init(int* arr, int len){ pMinHeap H = (pMinHeap)malloc(sizeof(MinHeap)); H->size = 0; H->max = len; for(int i=0;i<len;i++){ pHuff node = (pHuff)malloc(sizeof(Huff)); node->weight = arr[i]; node->lchild = NULL; node->rchild = NULL; H->Node[i] = node; H->size++; } return H; } //创建最小堆 void creat(pMinHeap H){ for(int i=H->size/2-1;i>=0;i--){ int parent = i; int child = i*2+1; while(child<H->size){ if(child+1<H->size && H->Node[child+1]->weight<H->Node[child]->weight) child++; if(H->Node[child]->weight<H->Node[parent]->weight){ pHuff hu = H->Node[child]; H->Node[child] = H->Node[parent]; H->Node[parent] = hu; parent = child; child = parent*2+1; } else{ break; } } } } bool IsFull(pMinHeap H){ if(H->size==H->max){ return true; } return false; } bool IsEmpty(pMinHeap H){ if(H->size==0){ return true; } return false; } //插入 void Insert(pMinHeap H, pHuff Hu){ if(IsFull(H)){ printf("堆满"); return; } int i=H->size; H->Node[i] = Hu; H->size++; } int main(){ int arr[] = {1, 2, 3, 4, 5}; int len = sizeof(arr) / sizeof(arr[0]); pMinHeap minHeap = init(arr, len); creat(minHeap); return 0; }修改后的代码需要先分配哈夫曼树节点的内存空间,然后再通过指针访问和修改节点的成员变量。同时,
creat函数中的循环条件和数组下标计算也做了调整,使其能正确地构建最小堆。【相关推荐】
- 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7624238
- 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:少用,尽量不用递归
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报-