【发布时间】:2021-12-22 09:16:53
【问题描述】:
我的 C 程序有问题,由于某种原因,它没有返回我正在寻找的正确结果。当我运行它时,它会显示两次指令,然后即使我没有输入选择,也会说无效的选择,当我做出选择时,即使我相信代码是正确的,它也不会输出我想要的结果。
#include <stdio.h>
#include <stdlib.h>
int arr[100005];
int n;
void max(int index){
if (index>=n)return;
int left=2*index+1;
int right = 2*index + 2;
int mx_ind=index;
if (left < n && arr[left]>arr[mx_ind]){
mx_ind=left;
}
if (right < n && arr[left]>arr[mx_ind]){
mx_ind=right;
}
if (mx_ind !=index){
int tmp=arr[mx_ind];
arr[mx_ind]=arr[index];
arr[index]=tmp;
max(mx_ind);
}
}
int insert(int num,int location){
int p;
while (location>0)
{
p=(location-1)/2;
if(num>=arr[p])
{
arr[location]=arr[p];
}
else break;
location=p;
}
arr[location]=num;
return 0;
}
void del(int index){
arr[index]=arr[n-1];
n=n-1;
max(index);
}
void buildmaxheap(){
for (int i=n/2-1;i>=0;i--){
max(i);
}
}
void display(){
for (int i=0;i<n;i++){
printf("%d",arr[i]);
printf("\n");
}
}
int returnmax(){
return arr[0];
}
int extractmax(){
int mx=arr[0];
del(0);
return mx;
}
int main()
{
printf("enter num of elements");
scanf("%d",&n);
printf("enter value of elements");
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
buildmaxheap();
int num,index;
char choice;
while(1){
printf("1. extract max\n");
printf("2. insert new key\n");
printf("3. change key at A[i]\n");
printf("4. delete key at A[i] \n");
printf("5. return max\n");
printf("6. exit\n");
printf("Enter your choice:");
scanf("%c",&choice);
switch(choice)
{
case '1':
printf("Max value is : %d\n", extractmax);
break;
case '2':
scanf("%d",&num);
insert(num,n);
n++;
printf("Content of array is:");
display();
break;
case '3':
scanf("%d %d",&index,&num);
arr[index]=num;
if (arr[(index-1)/2]>num)max(index);
else insert(num,index);
printf("content of array is : ");
display();
break;
case '4':
scanf("%d",&index);
del(index);
printf("Content of array is : \n");
display();
break;
case '5':
printf("Max value is : %d\n", extractmax);
break;
case '6':
exit(1);
break;
default:printf("invalid choice\n");
}
}
return 0;
}
任何帮助将不胜感激。
【问题讨论】:
-
scanf(" %c",&choice);在%c之前放一个空格。它可能会解决您的问题。 -
谢谢!这适用于菜单部分,我仍然不明白为什么在尝试提取堆的最大值时它显示一个巨大的数字。
标签: arrays c data-structures heap