你好我试图在c中创建一个堆!这是我的堆结构。
struct heap{
double* array;
int maxSize;
int currentSize;
};
这是我的主要内容:
int n;
double *array1,hmax;
struct heap *h;
int i;
printf("\n Enter the number of elements: ");
scanf(" %d",&n);
array1=(double*)malloc(sizeof(double)*n);
printf("\n Forming the heap please wait...\n");
for( i=1;i<=n;i++ ){
array1[i]=(double)rand()/1000;
printf("%.2f /",array1[i]);
}
printf("\n Now the array in heap form is: ");
for( i=1;i<=n;i++ ){
printf("\n %.2f",array1[i]);
}
h=createHeap(array1,n);
createHeap方法是这样的:
struct heap* createHeap( double array1[],int length ){
int i;
struct heap *h=(struct heap*)malloc(sizeof(struct heap*));
if( !h ){
printf("No free memory system exit...\n");
abort();
}
h->maxSize=length;
h->currentSize=0;
h->array=(double*)malloc(sizeof(double)*(h->maxSize+1));
printf("here");
if( !h->array ){
fprintf(stderr, "Not enough memory!\n");
abort();
}
for( i=0; i<length; i++ ){
h->array[i+1]=array1[i];
}
h->currentSize=length;
for( i=h->maxSize/2; i>0; i-- ){
heapify(h,i);
}
return h;
在这个方法中我创建并插入堆中的所有双数。我不能通过数组malloc。我尝试了一切,但仍然无法使其发挥作用! 任何帮助是极大的赞赏, 谢谢你们。
答案 0 :(得分:2)
问题出在其他地方。 (虽然前面提到的malloc
也是问题。)
您没有在array
例程中正确初始化初始结构main
:
array1=(double*)malloc(sizeof(double)*n);
printf("\n Forming the heap please wait...\n");
for( i=1;i<=n;i++ ){
array1[i]=(double)rand()/1000;
printf("%.2f /",array1[i]);
}
这会将数据写入array1[1]
到array1[n]
,但最后一个值在C中无效。长度 n 的数组从0
开始并结束在n-1
。将循环更改为
for (i=0;i<n;i++)
最有可能的是,随机内存会被覆盖,从而导致其他地方出现无关的错误。
答案 1 :(得分:1)
这条线错了。
struct heap *h=(struct heap*)malloc(sizeof(struct heap*));
需要:
struct heap *h=malloc(sizeof(struct heap));
答案 2 :(得分:0)
这些界限合起来没有意义:
array1=(double*)malloc(sizeof(double)*n);
for(i=1;i<=n;i++ ){
你分配一个包含n个元素的数组,但是然后尝试一直写到数组的末尾,并在结束后写1个元素!
相反,您的for循环应该如下所示:
for( i=0; i<n; i++ ){
<强>记住强>:
在C中,数组是基于ZERO的,而不是基于1的
第一个元素是array1[0]
。最后一个元素是array1[n-1]
元素array1[n]
是无效。