Dynamiczne dodawanie elementów do struktury

0

Dzień dobry,
Dostałem takie zadanie:

Zaprojektować strukturę przechowującą współrzędne punktu w prostokątnym układzie współrzędnych oraz strukturę umożliwiającą przechowywanie dowolnej liczby punktów wraz z ich ilością.

O ile pierwsza część jest banalnie prosta, o tyle nie wiem jak poradzić sobie z drugą.
Jedyny pomysł jaki przychodzi mi do głowy to struktura, która ma formę

 

struct punkty{
int punkty_x [];
int punkty_y[];
int ilosc punktow;
}


ale nie mam zielonego pojęcia jak dynamicznie dodawać do tej struktury "nieskończoną" ilość punktów.

Czy ktoś potrafi pomóc? :)
4

Twoja struktura nie ma sensu - ma przecież przechowywać struktury opisujące punkt, a nie je redefiniować w inny sposób. Jeśli chodzi o zmianę ich ilości zapoznaj się w dowolnym kursie z pojęciem wskaźników a potem z tercetem funkcji malloc/realloc/free.

2

Zrób sobie strukturę Punkt, a potem strukturę Punkty na zasadzie:

Punkt *punkty; // gwiazdka, a nie []
size_t liczbaPunktow; // zwróć uwagę na typ

Dodawanie to po prostu realokacja tablicy punkty na tablicę o rozmiar większą (free/malloc bądź realloc), przekopiowanie starych danych i zapisanie na końcu nowego punktu. Ewentualnie możesz wykorzystać linked list (nie mam pojęcia jak to jest po polsku).

0

Dziękuje za pomoc Panowie.

Dzięki Wam udało mi się co nieco zakodzić :)

Stworzyłem strukturę pojedynczego punktu:

 struct punkt
{
	int x;
	int y;
};

oraz strukturę z tablicą punktów:

struct TabPunktow
{
	char** tablica;
	int rozmiar;
};

Jednak mam problem, bo nie działa mi funkcja, która dodaje strukture Punkt do tablicy w strukturze TabPunktow.

Funkcja wygląda tak:

 

void dodajpunktdotablicystruktur(struct punkt *jakispunkt, struct TabPunktow *struktura){
	int *tmp;
	int *wsk;
	wsk = jakispunkt;
	tmp = realloc(struktura->tablica, sizeof(jakispunkt)*(struktura->rozmiar + 1));
	struktura->tablica = tmp;
	struktura->tablica[struktura->rozmiar] = wsk;
	struktura->rozmiar = struktura->rozmiar + 1;

}

Czy ktoś z Was potrafiłby mi powiedzieć dlaczego to nie hula?

2
  1. dodajpunktdotablicystruktur oezunochybaminiepowieszżefajniesięczytazdaniazbudowanewtakisposóborazawierająceażzanadtozbędnegoazarazemniepotrzebnegoprzysłowiowegoczęstowykorzystywanegolaniawody. dodajPunkt wystarczy.
  2. char** tablica; dlaczego char**? :|
  3. int rozmiar; nie int, tylko unsigned int jak już (bo rozmiar nie może być ujemny), a najlepiej to size_t.
1

Bo jakoś typy wysysasz z palca.

  1. char** tablica; - skąd ten char?
  2. int *tmp; - skąd?
  3. int *wsk; - skąd?
  4. zamiast struktura->rozmiar = struktura->rozmiar + 1; wystarczy ++struktura->rozmiar
0

Rzeczywiście, głupie błędy z mojej strony, już poprawione, teraz wygląda to tak:

struct TabPunktow
{
	punkt *tablicapunktow;
	size_t rozmiar;
};
 

W takim razie jaki typ wskaźnika powinienem dać na realloc? Czy powinien wyglądać tak:

punkt *wskaznik;
 

?
Poczytałem trochę i z tego co zrozumiałem to kolejność powinna być taka:

  1. Stworzenie wskaźnika
  2. Użycie realloca (kompilator szuka miejsca, przerzuca starą tablicę w miejsce utworzonego wskaźnika i dodaje dodatkowe miejsce)
  3. Zastąpienie starego wskaźnika nowym

Czy to co pisze, jest poprawne?

0

taki sam typ jak: struktura->tablica, poza tym: sizeof(punkt)*(struktura->rozmiar + 1)
Te punkty 1,2,3 możesz zrobić w jednym wierszu, no chyba ze chcesz obsłużyć przypadek braku pamięci ale wtedy brakuje punktu 2.5

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.