• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usuwanie elementów w tablicy (alokacja) - C

Object Storage Arubacloud
0 głosów
428 wizyt
pytanie zadane 8 czerwca 2020 w C i C++ przez fortuna Początkujący (310 p.)

Mam taką strukturkę, gdzie :

ptr- wskaznik do bloku danych w tablicy

size - liczba elementow

capacity - pojemnosc tablicy 

struct array_t{
	int *ptr;
	int size;
	int capacity;
};

Próbuje napisać funkcje, która  usuwa wszystkie elementy o wartości value z tablicy a i zwraca ilosc usunietych elementow. Proces usuwania elementów ze środka tablicy nie może zmieniać kolejności jej elementów. Na puste miejsca należy przesuwać elementy o wyższym indeksie.

Jednak mi nie wychodzi

Oto mój kod:

int array_remove_item(struct array_t *a, int value)
{
    if(a==NULL || a->ptr==NULL) return 1;
    if(a->size<=0) return 1;
    if(a->capacity<=0) return 1;
    if(a->capacity>a->size) return 1;
    int licznik=0;

    for(int i=0;i<a->size;++i)
    {

        if(*(a->ptr+i)==value)
        {
            licznik++;
        }
    }
    for(int i=0;i<a->size;++i)
    {


        if(*(a->ptr+i)==value)
        {
            *(a->ptr+i)=*(a->ptr+i+1);

        }
    }

        a->size=a->size-licznik;
        a->capacity=a->capacity+licznik;
        a->ptr=realloc(a->ptr,a->capacity*(sizeof(int)));


    return licznik;
}

Przykładowo funkcja powinna działać tak:  Usunięcie 3 z tablicy 2 3 -3 3 3 20 1 da tablicę 2 -3 20 1.

 

Jak to naprawic?

komentarz 9 czerwca 2020 przez j23 Mędrzec (194,920 p.)

if (a->capacity > a->size) return 1;

Pewny jesteś tego warunku?

1 odpowiedź

0 głosów
odpowiedź 8 czerwca 2020 przez mokrowski Mędrzec (155,460 p.)
Ogólnie, nie tędy droga. Lepiej (przy braku deficytu pamięci i prościej):

1. Alokuj dynamicznie bufor o wielkości pierwotnej tablicy.

2. Kopiuj dane z oryginalnej tablicy do bufora z pominięciem elementu usuwanego (zliczaj ile razy wystąpił).

3. Skopiuj bufor do oryginalnej tablicy (np. memcpy(...))

4. Zwolnij bufor (z pkt 1).

5. Zmniejsz wartość size w strukturze o ilość elementów usuniętych.

6. Zwróć ilość elementów usuniętych.

Jeśli jest deficyt pamięci i .. nieco bardziej złożone:

1. Inicjuj dwa indeksy wskazujące na element wpisywany i przeglądany.

2. Przejdź zliczając ilość elementów usuwanych i kopiując dane z jednego indeksu do drugiego i pomijając inkrementację indeksu wskaźnika docelowego, jeśli jest element jest równy wartości usuwanej.

3. Zmniejsz wartość size w strukturze o ilość elementów usuniętych

4. Zwróć ilość elementów usuniętych

W obydwu rozwiązaniach, nie ma realloc(...) tu realloc(...) jest zbędne. Co innego gdyby to było powiększanie kontenera.

Podobne pytania

0 głosów
1 odpowiedź 180 wizyt
pytanie zadane 21 stycznia 2018 w C i C++ przez szachovy Początkujący (270 p.)
0 głosów
1 odpowiedź 1,564 wizyt
pytanie zadane 4 lipca 2017 w C i C++ przez kyly Początkujący (260 p.)
0 głosów
1 odpowiedź 439 wizyt

92,568 zapytań

141,421 odpowiedzi

319,626 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...