STUDIUM PRZYPADKU IMPLEMENTACJA LISTY WSKAŹNIKOWEJ 147

5. Wróć do punktu 2

void wypisz_liste(el_listy 'lista)

{

el.listy *wsk=lista;    /• 1 */

while( wsk !- NULL )    /• 2 •/

{

printf ("Xlu\n", wsk->val); /• 3 •/ wsk ■ wsk->next;    /• 4 */

>    /• 5 •/

Zastanówmy się teraz, jak powinien wyglądać kod, który dodaje do listy następny element. Taka funkcja powinna:

1.    znaleźć ostatni element (tj. element, którego pole next == NULL)

2.    przydzielić odpowiedni obszar pomięci

3.    skopiować w pole val w nowo przydzielonym obszarze znalezioną liczbę pierwszą

4.    nadać polu next ostatniego elementu listy wartość NULL

5.    w pole next ostatniego elementu listy wpisać adres nowo przydzielonego obszaru Napiszmy zatem odpowiednią funkcję:

void dodaj_do_listy (el.listy 'lista, unsigned long liczba)

{

el_listy *wsk, 'nowy; wsk = lista;

while (wsk->next !■ NULL)    /* 1 */

{

wsk - wsk->next; /* przesuwamy wsk aż znajdziemy ostatni element • /

>

nowy = malloc (sizeof(el.listy));    /* 2 */

nowy->val = liczba;    /* 3 */

nowy->next = NULL;    /* 4 */

wsk->next * nowy;    /* 5 */

)

I... to już właściwie koniec naszej funkcji (warto zwrócić uwagę, że funkcja w tej wersji zakłada, że na liście jest już przynajmniej jeden element). Wstaw ją do kodu przed funkcją main. Został nam jeszcze jeden problem: w pętli for musimy dodać lani, który odpowiednio l>ędzie "badał" liczby oraz w przypadku stwierdzenia pierwszeństwa liczby, będzie dodawał ją do listy. Ten kod powinien wyglądać mniej więcej tak:

int jest_pierwsza(el_listy 'lista, int liczba)

<

el.listy *wsk;

wsk ■ first;

while (wsk !- NULL) {

if ((liczba X wsk->val)==0) return 0; /* jeśli reszta z dzielenia liczby przez którąkolwiek z poprzednio znalezionych liczb pierwszych jest równa zero, to znaczy, że liczba ta nie jest liczbą pierwszą */ wsk ■ wsk->next;

}

/* natomiast jeśli sprawdzimy wszystkie poprzednio znalezione liczby