【发布时间】:2020-07-21 15:22:36
【问题描述】:
我一直在尝试用 "C" 语言实现堆(这是最大堆),但问题是我没有得到合适的从它的输出,在insert函数下面的代码中,将输入数据和为堆创建的数组的地址作为参数,然后检查数据是否大于它的父节点,如果数据结果更大,然后它将放置在父索引上的较小值替换为放置在数据索引上的较高值,并重复该过程直到它满足最大堆的属性或直到达到根,这里parent的索引表示为heap[i-1]/2,而新增数据的索引就是"i"即heap[i]
假设我输入 20,然后如果我输入一个更大的值,比如 30,那么输出应该是 30
20 但我只得到 30 的输出,如果决定添加另一个更大的值(比如 40),那么它将替换 30 和输出变成只有 40。
这是代码->
int i = 0;
void insert(int heap[],int data)
{
int j = 0;
if(i == 0)
{
heap[i] = data;
}
else if(heap[(i-1)/2] < data)
{
heap[i] = heap[(i-1)/2];
i = (i-1)/2;
insert(heap,data);
}
}
void display(int heap[],int size)
{
system("cls");
for(int i=0,j=1;i<size;i++,j++)
{
printf("%d.) %d\n",j,heap[i]);
}
}
void main()
{
int heap[5],men,data,c;
while(1)
{
system("cls");
printf("1.) Insert\n");
printf("2.) Display\n");
printf("3.) exit\n");
printf("Enter your choice : ");
scanf("%d",&men);
switch(men)
{
case 1 : printf("Enter data : ");
scanf("%d",&data);
heap[i] = data;
insert(heap,data);
i++;
printf("%d successfully added to heap!",data);
break;
case 2 : display(heap,i);
break;
case 3 : exit(0);
break;
default : printf("Invalid choice!");
while((c=fgetc(stdin))!='\n'){}
break;
}
getch();
}
}
【问题讨论】:
-
请不要为 C 问题标记 C++。它们是不同的语言。
-
您使用相同的变量
i来维护堆并跟踪堆的大小。你应该把它们分开。 -
@valarMorghulis 是的!你是对的,我刚才也意识到了同样的事情,谢谢你的回答!