1

作为我研究的一部分,我们正在学习使用“堆”,并负责编写一个简短的数学程序,使用指针来引用和尊重堆。作为一些个人学习,我尝试通过创建一个数组并在其上使用二进制搜索来复制它。但它根本行不通。

这是我的代码:

#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 循环中。发生了一些事情,这意味着它没有正确搜索数组。对不起,我没有澄清这一点。

4

3 回答 3

3

delete 关键字释放指针指向的内存。所以你不应该在那之后再次尝试使用指针。

此外,当指针指向数组时,您必须使用 delete[] uArray 语法,否则内存将无法正确释放。

不确定这是否是“不起作用”的部分,因为您没有更具体。

于 2012-10-12T11:53:22.160 回答
0

while 循环在数组中找不到正确元素的原因与指针的使用无关。我可以直接给你答案,但你自己找到它会更有用(在你看下面的剧透之前)。

我建议您尝试在调试器中运行代码。如果您以前没有使用过调试器,我强烈建议您尝试一下。在 while 循环的开始处设置断点。您可能会发现在一张纸上写下 uArray[] 数组的内容以供参考很有用。然后单步执行 while 循环一行,仔细注意 if 语句——它是否进入 if 子句或 else 子句,以及它是否移动 *top 或 *bottom。鉴于 *uChoice 的值与 uArray[*ii] 相比,看看发生的事情是否有意义。

这是一个微不足道的错误,一旦你发现它就会踢自己。但更有用的一课是如何调试代码。

(如果你没有调试器,你可以通过在while循环中插入几条cout语句来打印出关键变量的值来达到同样的效果。)

这是答案(鼠标悬停查看):

在比较 uArray[*ii] 和 *uChoice 的测试中,大于运算符应该是小于。如果您要搜索的数字小于数组中的值,则您知道它在下半部分,因此您要从上往下移动,而不是从下往上移动。

于 2012-10-15T07:18:21.957 回答
0

从技术上讲,标准没有定义“堆”,但就实现而言,它在Freestore而不是堆上new创建元素。在Heap上创建元素。 malloc()

好读物:
GotW #9:内存管理 - 第一部分


当你这样做时,你有一个未定义的行为

   int* uArray = new int[12];
   delete uArray; 

你需要:

delete []uArray;
于 2012-10-12T11:52:01.453 回答