Struktury C

0

A więc, analizując poniższy kod, nie wiem dlaczego w deklaracji pierwszej struktury "element" w jej wnętrzu już znajduje się "struct element *next". Czy "el_listy *first;" to wskaźnik do struktury ?

#include <stdio.h>
#include <stdlib.h>

typedef struct element {
  struct element *next;
  unsigned long val;
} el_listy;

el_listy *first;

void dodaj_do_listy (el_listy *lista, unsigned long liczba)
{
  el_listy *wsk, *nowy;
  wsk = lista;
  while (wsk->next != NULL)
    {
    wsk = wsk->next; /* przesuwamy wsk aż znajdziemy ostatni element */
    }
  nowy = (el_listy *) malloc (sizeof(el_listy));
  nowy->val = liczba;
  nowy->next = NULL;
  wsk->next = nowy; /* podczepiamy nowy element do ostatniego z listy */
}

void wypisz_liste(el_listy *lista)
{
  el_listy *wsk=lista;
  while( wsk != NULL )
    {
    printf ("%lu\n", wsk->val);
    wsk = wsk->next;
    }
}

int jest_pierwsza(el_listy *lista, int liczba)
{
  el_listy *wsk;
  wsk = first;
  while (wsk != NULL) {
    if ((liczba%wsk->val)==0) return 0;
       wsk = wsk->next;
    }
    return 1;
}




int main ()
{
  unsigned long i = 3; /* szukamy liczb pierwszych w zakresie od 3 do 100 */
  const unsigned long END = 100;
  first = (el_listy *) malloc (sizeof(el_listy));
  first->val = 2;
  first->next = NULL;
  for (;i!=END;++i) {
    if (jest_pierwsza(first, i))
      dodaj_do_listy (first, i);
      }
  wypisz_liste(first);
  getchar();
  return 0;
}

 
0

Bo w C są tak jakby dwie przestrzenie nazw (w sumie to jest więcej), ta "zwykła" i przestrzeń tagów struktur. Tag struktury to nazwa po struct. Na podstawie samego tagu nie można utworzyć zmiennej, dlatego trzeba pisać struct tag_struktury nazwa_zmiennej, żeby było wiadomo, że chodzi o tag. Dodawanie typedef przed deklaracją struktury powoduje, że jest ona widoczna od razu w tej "zwykłej przestrzeni" typów i można robić właśnie el_listy *first;. Jednak wewnątrz struktury typedef jeszcze nie działa i tam trzeba użyć tej pierwszej konstrukcji.

W Twoim przypadku jest to koniecznie, bo musisz mieć wskaźnik na kolejny element listy. struct element *next oraz el_listy *first to wskaźniki na tę samą strukturę.

0

A dlaczego przy next musi to być akurat wskaźnik do struktury? Nie wystarczyłoby gdyby next było zwyczajną zmienną?

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