作为我学习的一部分,我们正在学习使用“堆”,并负责编写一个简短的数学程序,使用指针来引用和遵循堆。 作为一些个人学习,我试图通过创建一个并使用二进制搜索来复制它。但它根本行不通。
这是我的代码:
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
//creating pointers
int* ii = new int;
int* top = new int;
int* bottom = new int;
int* uArray = new int[12];
int* uChoice = new int;
//assigning values in location of pointer
*ii = 5;
*top = 11;
*bottom = 0;
cout<<"Please input a value between 1 and 12 to find in the array: \t";
cin >> *uChoice;
for (int x = 0; x<12; x++) //adding values into the array
{
uArray[x] = x;
cout<<x;
Sleep(1000);//checking loop works
}
while (uArray[*ii] != *uChoice)
{
if (uArray[*ii] > *uChoice)
{
*bottom = *ii;
*ii = (*top + *bottom)/2;
}
else
{
*top = *ii;
*ii = (*top + *bottom) /2;
}
if (*uChoice == *ii)
{
break;
}
}
//clearing pointers.
delete ii;
delete top;
delete bottom;
delete uArray;
ii = 0;
top = 0;
bottom = 0;
uArray = 0;
cout<<uChoice<<" Found at position: \t"<< *ii;
Sleep(10000);
return 0;
}
非常感谢提前。
[编辑:]错误发生在while循环中。发生了一些事情,这意味着它没有正确搜索数组。对不起,我没有澄清这一点。
答案 0 :(得分:3)
delete关键字释放指针指向的内存。所以你不应该在那之后再尝试使用指针。
此外,当指针指向数组时,必须使用delete [] uArray语法,否则内存将无法正常释放。
不确定这是否“不起作用”的部分,因为你不是更具体。
答案 1 :(得分:0)
从技术上讲,标准没有定义“堆”但是到目前为止实现它,new
在 Freestore 而不是堆上创建元素。 malloc()
在堆上创建元素。
好读:
GotW #9: Memory Management - Part I
您执行以下操作时潜伏着未定义的行为:
int* uArray = new int[12];
delete uArray;
你需要:
delete []uArray;
答案 2 :(得分:0)
while循环在数组中找不到正确的元素的原因与指针的使用无关。我可以直接给你答案,但你自己找到它会更有用(在你看下面的扰流板之前)。
我建议你尝试在调试器中运行代码。如果您之前没有使用过调试器,我强烈建议您尝试一下。在while循环的开头设置断点。您可能会发现在一张纸上写下uArray []数组的内容以供参考是有用的。然后一次一行地执行while循环,注意if语句 - 是否进入if子句或else子句,结果是它是移动* top还是* bottom。看看* uChoice与uArray [* ii]相比的价值是否有意义。
这是一个微不足道的错误,一旦你发现它就会踢你自己。但更有用的教训是如何调试代码。
(如果你没有调试器,你可以通过在while循环中插入几个cout语句来打印出关键变量的值来达到同样的效果。)
这是答案(鼠标悬停看):
大于运算符应该小于比较uArray [* ii]和* uChoice的测试。如果您要搜索的数字小于数组中的值,则表示它位于下半部分,因此您希望将自上而下移动,而不是自下而上。