Orientace ve struktuře pomocí indexu od uživatele rubrika: Programování: C/C++

4 Levin
položil/-a 2.12.2015
 
upravil/-a 2.12.2015

Ahoj,

mám následující strukturu

typedef struct den
{
    int *cisla;
} DEN;
 
DEN *dny;
dny = (DEN)malloc( pocetdnu * sizeof(DEN));

K tomu následně pomocí funkce alokuji v základu 2 pozice pro každý den. Poté to vypadá např.

dny[0].cisla[0];
dny[0].cisla[1];

Jde o to, že uživatel může zadávat čísla dokud se mu zachce, vždy ve tvaru cisloDne a jakékoli číslo, která si já potřebuji přiřadit k tomu dni. Např. zadá 1 5 takže potřebuji uložit dny[1].cisla[k] = 5;. Může zadávat např pro den 1 5x hodnotu, poté pro den 2 1x hodnotu a znova hodnoty pro den 1. Tady nastává ten problém, jak si evidovat jednotlivé k, na jakou pozici musí být přiřazeno k, aby nebyl přepsán žádný znak před a ani aby nebylo žádné volné místo. K potřebuji zárověň kontrolovat, abych měl místo a mohl případně použít realoc. Díky za nasměrování, jak na to.
Jedná se o jazyk C.

odkaz Vyřešeno
2 nixbody
odpověděl/-a 3.12.2015
 
upravil/-a 3.12.2015

Jestli dobre chapu popsany problem, tak bych to resil nejak takhle:

typedef struct day_number
{
    size_t index;
    int value;
};
 
typedef struct day
{
    day_number* numbers;
    size_t numbers_size;
};
 
day* create_days(size_t count)
{
   day* days = malloc(count * sizeof(day));
   for (size_t i = 0; i < count; ++i) {
       days[i] = {0, 0};
   }
 
   return days;
}
 
day_number* find_day_number(day* day, const size_t number_index)
{
   for (size_t i = 0; i < day->numbers_size; ++i) {
       if (number_index == day->numbers[i].index) {
           return day->numbers + i;
       }
   }
 
   return 0;
}
 
void set_day_number(day* day, const size_t number_index, const int number_value)
{
   day_number* number = find_day_number(day, number_index);
   if (!number) {
       day->numbers = realloc(day->numbers, ++day->numbers_size * sizeof(day_number));
       number = day->numbers + day->numbers_size - 1;
   }
 
   number->index = number_index;
   number->value = number_value;
}

Je to spis pro ilustraci, psal jsem to na telefonu, takze to nemam otestovane a navic je to dost naivni implementace, lepsi by bylo pouzit hash mapu kvuli rychlosti vyhledavani, ale implementaci hash mapy sem psat nebudu :)

Komentáře

  • roman.hocke : Klobouk dolů za psaní kódu na telefonu :-) 3.12.2015
  • nov.ondrej : Jojo, taky mně to překvapilo, zkoušel jsem na telefonu programovat a to mam LG F3Q s klávesnicí, a nešlo mi to. Napsat tohle na telefonu... velké uznání 3.12.2015

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.