¿Cómo eliminar un elemento de una matriz de estructura que tiene punteros?

Esta es mi estructura que tiene dos punteros enteros aV y aT.

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

El proceso de asignación de aV y aT es así...

    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];
}

Quiero eliminar un elemento específico de la matriz Umb. por ejemplo, quiero eliminar Umb[5], entonces, ¿cómo puedo eliminarlo? Lo intenté con varios métodos, pero creo que obtuve un error debido a los punteros asignados. Lo he intentado con el método de seguimiento, pero no funciona con este tipo de matriz de estructura. Está trabajando con una matriz de estructura que no tiene punteros.

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;
}

¿Tiene alguna idea de cómo eliminar un elemento de mi matriz de estructura?

preguntado el 26 de agosto de 12 a las 05:08

¿Nuevo es C ++ solo qué idioma está usando? -

Tu pregunta está etiquetada C (y no C++), pero estás usando new. ¿Estás realmente limitado a C? -

"nuevo" es c++. Si está escribiendo C, debe usar malloc(). -

por supuesto, c y c ++. Estoy usando Visual Studio C ++ 2010. Déjame etiquetar c ++ también.. -

3 Respuestas

Deberá eliminar las matrices en el elemento eliminado para liberar su memoria:

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

Luego, solo tiene que hacer un solo movimiento de memoria para eliminar el elemento.

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

EDITAR: como señala Mahmoud, esto no usa el at parámetro en DeleteStructElement; No estoy seguro de lo que pretendías que hiciera ese parámetro.

Respondido 26 ago 12, 05:08

No hizo uso del parámetro 'en' pero voté porque esta es la respuesta correcta. Dile que elimine el parámetro no utilizado. - mahmud fayez

gracias "neonneo". ¿Quiere decir que no necesito mover todos los elementos anteriores? significa que no hay necesidad de bucle for? simplemente elimine los elementos del índice y mueva la memoria del índice + 1 para indexar, ¿eso es todo? esto es lo que quieres decir? - maxpayne

Bueno, en realidad, memmove es capaz de mover más de un elemento a la vez, ya que solo mueve bloques enteros de memoria. En este caso, configuré el número de bytes (el tercer parámetro) para que mueva todos los elementos restantes. - neonneo

¿Puedes decirme también si es correcto copiar usando memcpy? así... memcpy(temp, Umb, nb*sizeof(ADJP)); en este caso, no estamos asignando memoria para temp.aV y temp.aT, entonces, ¿copiar la memoria Umb a temp es legal? - maxpayne

memcpy es incorrecto ya que, en el código original, la fuente y el destino se superponen. No veo lo que quieres lograr con temp. - JohnB

   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;
   }

Respondido 26 ago 12, 08:08

Creo que tienes un error tipográfico. ¿No debería ser: delete [] b[index].aV; y probablemente también para(int i = index; i < nb - 2; ++i) - Scooter

Tienes razón con b{index]. Corregí eso. ¿Por qué i < nb - 2? - JohnB

Hmmm, no estoy seguro de por qué dije eso. No parece ahora que lo pienso. - Scooter

Asumiendo que realmente estás usando C++, un destructor en ADJP sería mucho más sencillo que DeleteStructElement.

Pero si estás haciendo una "C" interesante con new/delete (¿quizás un subconjunto bien confinado de C++?), entonces sugeriría llamar delete desde adentro DeleteStructElement.

pero obtuve un error debido a los punteros asignados, creo

Responder a esta pregunta puede ser mucho más importante que otras. ¿Supongo que esto fue un error de tiempo de ejecución? Use un depurador para descubrir exactamente dónde estaba la falla.

Respondido 26 ago 12, 05:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.