Stos liczb zespolonych C

0

Witam!

Muszę stworzyć konstrukcję stosu z liczbami zespolonymi.
Tworzę to na liście jednokierunkowej.
Do części rzeczywistej jak i urojonej ma być wczytana liczba albo int, albo float.
Wiem że to można zrobić jakoś za pomocą uni.

struct liczba
{
 int licz;
 struct liczba *nast;
};
 typedef struct liczba elem_listy;
 typedef elem_listy *lista_liczb;

Tak obecnie wygląda moja struktura.
Jak to przerobić bym mógł wczytać do części rzeczywistej bądź urojonej liczbę int lub float?

union rzeczywista {
   int calk;
   double n_calk;
 };
 union urojona {
   int i_calk;
   double i_n_calk;
 };

struct liczba
{
 int licz;
 struct liczba *nast;
 union rzeczywista rz;
 union urojona u;
};

 typedef struct liczba elem_listy;
 typedef elem_listy *lista_liczb;

Czy podana konstrukcja jest właściwa?
Jak odwołać się do uni gdy tworzony jest nowy element listy?

create(&li,0,0.52);
void create(lista_liczb *l,int k, double d_k)
{
 
 lista_liczb element;
 
 element=(lista_liczb)malloc(sizeof(elem_listy));
 element->rz.calk=k; /*było licz*/
 element->rz.n_calk=d_k;
 element->u.i_calk=k;
 element->u.i_n_calk=d_k;
 element->nast=*l;
 *l=element;
}

To fukcja dodająca elementy do listy. Proszę o nakierowanie mnie co robie źle.

Za pomoc z góry dziękuję!

0

najprostszym rozwiązaniem jest zrobienie czegoś w rodzaju:

typedef struct {
    enum { Int, Dbl } reType, imType;
    union {
        int nVal;
        double dVal;
    } re, im;
} Item;

"reType" oraz "imType" zawierają informacje jakiego typu oczekujesz od kolejnych części liczby zespolonej, a "re" oraz "im" to są te części.

edit:

daniel0801 napisał(a):
void create(lista_liczb *l,int k, double d_k)
{
 
 lista_liczb element;
 
 element=(lista_liczb)malloc(sizeof(elem_listy));
 element->rz.calk=k; /*było licz*/
 element->rz.n_calk=d_k;
 element->u.i_calk=k;
 element->u.i_n_calk=d_k;
 element->nast=*l;
 *l=element;
}

To fukcja dodająca elementy do listy. Proszę o nakierowanie mnie co robie źle.

  1. Zbędne rzutowanie przy malloc.
element->rz.calk=k; /*było licz*/
 element->rz.n_calk=d_k;

unia działa w ten sposób, że w danej chwili możesz uzyskać dostęp tylko do jednego z jej pól. Jeśli przypisujesz najpierw do jednego pola jakieś dane, a następnie do drugiego to wartość pierwszego pola może ulec zmianie (i w twoim wypadku int zazwyczaj ulegnie, natomiast double nie zawsze). Dlatego powinieneś odnosić się w danej chwili tylko do jednego pola unii.

0

Ok. Dzięki już czaje o co chodzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1