[C] Uit een Dynamisch Array plaats verwijderen met free()

Pagina: 1
Acties:

Onderwerpen


  • Michielodc
  • Registratie: September 2011
  • Laatst online: 22-08 19:30
Beste tweakers,

Op het moment ben ik bezig met een opdracht voor school. Hierbij moet er een Dynamish Array aangemaakt worden van een struct. Dit lukt, het toevoegen ook en het printen van alles dat erin zit ook. Alleen als ik een plek uit het array wil verwijderen, lukt het niet. Ik heb heel veel gezocht op google, maar kwam nergers erachter hoe het moet. Deze opdracht is nog maar een oefening, kijken of het verwijderen lukt.

Ik heb een struct, waarin 1 int zit. Deze zet ik in een Dynamisch Array met realloc. Via een menu kan ik steeds kiezen of ik een toevoeg, verwijder, print of exit wil doen.

Ik wil het volgende voor elkaar krijgen. Ik wil 3 int hebben met bepaalde waardes en print dat dan bijvoorbeeld zo:

Op plek 1 staat 1.
Op plek 2 staat 2.
Op plek 3 staat 3.

Dan wil ik met de functie free() het getal 2 verwijderen. Hierdoor wil ik het volgende krijgen:

Op plek 1 staat 1.
Op plek 3 staat 3. (Of moet dat dan plek 2 zijn?)

Dus hoe kan ik met free() nou 1 plaats verwijderen, ipv het gehele Dynamische Array? En verschuift het Array dan als ik iets verwijder dat er bijv in het midden zit?

Hier is wat uit mijn code.

Struct:
code:
1
2
3
4
struct number
{
    int test;
};



Variabelen:
code:
1
2
3
4
5
6
    number *test;
    number *test2 = NULL;
    number *verwijder = NULL;
    int keuze;
    int invoer;
    int totaal = 0;



Het dynamisch array uitbreiden met 1.


code:
1
2
3
4
5
6
7
8
            printf("\nVoer waarde in: ");
            scanf("%i", &invoer);

            totaal++;
            test = (number *)realloc(test2, totaal * sizeof(number));
            test2 = test;

            test[totaal - 1].test = invoer;


Het verwijderen van een plek van het Dynamische Array:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
            printf("\nWelk getal wilt u verwijderen?");
            scanf("%i", &invoer);

            for(int i = 0; i < totaal; i++)
            {
                if(invoer == test[i].test)
                {
                    verwijder = &test[i];
                    free(verwijder);
                    verwijder = NULL;
                }
            }
            totaal = totaal - 1;


Dan nog het printen:

code:
1
2
3
4
            for(int i = 0; i < totaal; i++)
            {
                printf("\nHet nummer op plek %i is %i.", i + 1, test[i]);
            }


Alvast bedankt!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Met free kun je niet een stuk verwijderen. Je moet een nieuwe array alloceren en de twee delen die je wilt bewaren naar de nieuwe array memcpy'en. Alternatief kun je een lijst met geldige elementen bijhouden.

  • Michielodc
  • Registratie: September 2011
  • Laatst online: 22-08 19:30
PrisonerOfPain schreef op donderdag 29 september 2011 @ 15:11:
Met free kun je niet een stuk verwijderen. Je moet een nieuwe array alloceren en de twee delen die je wilt bewaren naar de nieuwe array memcpy'en. Alternatief kun je een lijst met geldige elementen bijhouden.
Bedankt voor de informatie! Geen wonder dat ik het niet kon vinden.

  • PaveloW
  • Registratie: September 2005
  • Laatst online: 10:14
Wil je niet gewoon een linked list hebben? (Misschien een beetje overkill voor enkel int's.....)