1

我正在做一些作业,但在这里被卡住了。我正在尝试编写一个 list_add() 函数。它的第一个功能是向数组添加值。它的第二个功能是增加数组的大小。所以它的工作原理很像矢量。我不知道我是否做对了。我尝试的是创建一个比旧数组更大的新动态分配数组,然后将所有值复制到新数组中。

这是正确的方法吗?

这里是主体

int main()
{
    const int N = 7;

    //declaring dynamic array allocation
    int* list = new int[N];

    int used = 0, a_val;
    for(int i=0;i<11;i++)
    {
        list_add(list, used, N, i);
    }

    cout << endl << "Storlek: " << N << endl << endl;
    cout << "Printar listan " << endl;
    for(int i=0;i<used;i++)
    {
        cout << list[i] << ". ";
    }

}

这是功能

bool list_add(int *list, int& space_used, int max_size, int value)
{

    if(max_size-space_used > 0)
    {
        *(list+(max_size-space_used-1)) = value;
        space_used++;
        return true;
    }
    else
    {
        cout << "Increasing size of array!" << endl;
        int new_max_size = space_used+1;
        delete [] list;
        int *list_new = new int[new_max_size];

        for(int i=0; i<new_max_size; i++)
        {
            list_new[i] = i;
            cout << list_new[i] << ". ";
        }
        cout << endl;
        space_used++;
        list = list_new;
        return false;
    }
}
4

5 回答 5

1

你有正确的想法,但实施可以使用一点“肘部润滑脂”

试试这个:

保持 2 个整数

容量 - 您分配的长度
size - 数组的当前结尾

if capacity <= size:
   make new list( size = capacity x 2 )
   memcopy old list into new list -> if you can't memcopy, copy over the data one-by-one
   delete old list
if capacity > size:
   list[size] = value
   size++

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

于 2009-11-24T23:21:14.360 回答
1

我突然想到的一个问题是,您没有在 list_add 函数范围之外更改列表指针的值。你应该做一些改变,比如......

bool list_add(int *list, int& space_used, int max_size, int value)

变成

bool list_add(int **list, int& space_used, int max_size, int value)

list = list_new

变成

*list = list_new

否则,我认为您会发现,当您重新分配列表时,从 list_add 返回后,您的列表指针仍将指向旧位置。

于 2009-11-24T23:23:14.120 回答
1

您的代码实现存在四个问题:

  1. 它不会复制列表的元素。
  2. 它不会将值new_list赋给list变量main
  3. 它从后到前插入值,而不是在最后一个值之后
  4. max_size没有得到更新。很容易错过这一点,因为您每次只会将数组的大小增加一。这样,每次添加值时都需要进行分配。如果您将新大小增加一倍以上,它仍然会每次重新分配。

第一个问题可以通过更改 for 循环来解决,list_add以便复制:

for (int i = 0; i < space_used; i++) {   // this also changed.
    list_new[i] = list[i];
    cout ...
}
// insert the new value (in the front?)
list_new[max_size-space_used-1] = value;     
delete [] list;         // Delete the list afterwards instead of earlier.

第二个问题可以通过返回一个指向列表的指针来解决。把main函数改成这样:

for (int i = 0; i < 11; i++) {
    list = list_add(list, used, N, i); 
} 

第三个问题可以通过更改此行来解决

list_new[max_size-space_used-1] = value;

list_new[space_used++] = value;

您还应该space_used++在此之后删除。

要查看第四个问题,您应该更改此行

int new_max_size = space_used+1;

int new_max_size = space_used+3;

它仍然会每次重新分配。然而,它应该只重新分配两次。


这是完整的代码:

#include <iostream>
using std::cout;
using std::endl;

int* list_add(int *list, int& space_used, int& max_size, int value) {
    if (max_size - space_used > 0) {
        list[space_used++] = value;
        return list;
    }
    else {
        cout << "Increasing size of array!" << endl;
        int new_max_size = space_used+1;

        int *list_new = new int[new_max_size];

        for (int i = 0; i < space_used; i++) {
            list_new[i] = list[i];
            cout << list_new[i] << ". ";
        }
        cout << endl;

        list_new[space_used++] = value;
        max_size=new_max_size;

        delete [] list;
        return list_new;
    }
}

int main() {
    int N = 7;

    //declaring dynamic array allocation
    int* list = new int[N];

    int used = 0, a_val;

    for (int i = 0; i < 11; i++) {
        list=list_add(list, used, N, i);
    }

    cout << endl << "Storlek: " << N << endl << endl;
    cout << "Printar listan " << endl;

    for (int i = 0; i < used; i++) {
        cout << list[i] << ". ";
    }
}
于 2009-11-25T10:48:07.967 回答
0

我会担心这条线:

*(list+(max_size-space_used-1)) = value;

和这个:

list_new[i] = i;
于 2009-11-24T23:17:27.837 回答
-2

知道如何解决问题有很多话要说,但这不是其中之一。

#include <vector>
#include <iostream>

int main() 
{
    std::vector<int> numbers;

    for (int i = 0; i < 11; i++) {
        numbers.push_back(i);
    }

    for (int i = 0; i < numbers.size(); i++) {
        std::cout << numbers[i] << ". ";
    }

    std::cout << "\n";
}

更新:如上在我的另一个答案中所示,他的函数在 16 行中至少包含四个错误。这是每四行代码的一个错误。然后是代码设计的问题。例如数组的大小和数组本身应该在一起。您不能以其他方式保证该功能有效。

代码 (2,4) 中的两个问题可以通过使用struct包含数组指针和数据结构的 max_size 的 a 来解决。这样,您必须将两个变量一起传递。

于 2009-11-24T23:38:38.903 回答