3

这是我的结构,它有两个整数指针 aV 和 aT。

struct ADJP
{
    int *aV;
    int eV;
    int nV;
    int *aT;
    int nT;
};
ADJP *Umb = NULL;

aV和aT的分配过程是这样的..

    for(int i=0; i<nb; i++)
    {
        Umb[i].aV = new int[N];
        for(int j=0; j<n; j++)
            Umb[i].aV[j] = pIn[i].aV[j];
}

我想从 Umb 数组中删除一个特定元素。例如我想删除 Umb[5],那么我该如何删除。我尝试过各种数学方法,但由于我认为分配的指针而出错。我尝试过使用 follow 方法,但它不适用于这种结构数组。它正在使用没有指针的结构数组。

int DeleteStructElement(int Index, ADJP *b, int N, int at)
{
    for(int i=Index; i<N-1; i++)
        memmove(&b[i], &b[i+1], (N-at-1)*sizeof*b);     // moving the terms of array
    N--;                                                // updating new size
    return N;
}

知道如何从我的结构数组中删除一个元素吗?

4

3 回答 3

2

您将需要删除已删除元素中的数组以释放它们的内存:

delete[] b[Index].aV;
delete[] b[Index].aT;

然后,您只需执行一次 memmove 即可删除该元素。

memmove(&b[Index], &b[Index+1], (N-Index-1) * sizeof(b[Index])

编辑:正如 Mahmoud 指出的,这不使用at参数 in DeleteStructElement; 我不确定您打算使用该参数做什么。

于 2012-08-26T04:09:26.443 回答
2
   int DeleteStructElement (int index, ADJP * b, int nb) {
      delete [] (b[index].aV);
      for (int i = index; i < nb - 1; ++i) {
         b[i] = b[i+1];
      }
      return nb - 1;
   }
于 2012-08-26T04:12:23.873 回答
0

假设您真的在使用 C++,那么 in 中的析构函数ADJP将比DeleteStructElement.

但是如果你正在用new/做一些有趣的“C” delete(也许是 C++ 的一个严格的子集?),那么我建议delete从inside 调用DeleteStructElement

但我认为由于分配的指针而出错

回答这个问题可能比其他问题重要得多。我假设这是一个运行时错误?使用调试器准确找出故障所在。

于 2012-08-26T04:13:17.070 回答