C/Typy złożone: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
→Implementacja listy: rozmiar |
→Implementacja listy: dwukierunkowa lista |
||
Linia 311:
# Przesuń wskaźnik na element, który jest wskazywany przez pole next
# Wróć do punktu 2
Nasza lista ma być dwukierunkowa, więc użyjemy algorytmu odwrotnego:
# Sprawdź, czy lista nie jest pusta
# Jeśli tak, to wyjdź z funkcji
# W przeciwnym wypadku, sprawdź czy istnieje następny element listy
# Jeśli tak, to jest uruchamiana rekurencja tak, by pierwszy argument wskazywał na następny element listy
# Wypisz element wskazywany przez pierwszy argument
# W funkcji nic już więcej nie umieszczamy, nie pobieramy w niej tak jak poprzednio następnego elementu
Nato
<source lang="c">
typedef struct lista
{
/* ... */
void (*wypisz)(struct lista*, FILE*); /* deklaracja metody o nazwie 'wypisz' */
void (*wypisz_odwrotnie)(struct lista*, FILE*);
} List;
void wypisz_liste(List *lista, FILE* strumien)
Linia 324 ⟶ 333:
lista = lista->next; /* 3 */
} /* 4 */
}
void wypisz_liste_odwrotnie(List *lista, FILE *strumien)
{
if (lista == NULL) return;
if (lista->next) wypisz_liste_odwrotnie(lista->next, strumien);
fprintf(strumien, "%p", *lista->val);
}
</source>
Linia 390 ⟶ 405:
my_list.dodaj = dodaj_do_listy;
my_list.jest_pierwsza = jest_pierwsza;
my_list.wypisz_odwrotnie = wypisz_liste_odwrotnie;
my_list.size = 0;
return my_list;
Linia 400 ⟶ 416:
#include <stdlib.h>
typedef struct
struct
void (*dodaj)(struct lista*, void*);
void (*wypisz)(struct lista*, FILE*);
void (*wypisz_odwrotnie)(struct lista*, FILE*);
int (*jest_pierwsza)(struct lista*, int);
} List;
List first;
Linia 412 ⟶ 432:
my_list.dodaj = dodaj_do_listy;
my_list.jest_pierwsza = jest_pierwsza;
my_list.wypisz_odwrotnie = wypisz_liste_odwrotnie;
return my_list;
}
Linia 429 ⟶ 450:
}
void wypisz_liste(List *lista, FILE *strum)
{
while( wsk != NULL )
{
wsk = wsk->next;
}
}
void wypisz_liste_odwrotnie(List *lista, FILE* strum)
{
if(lista == NULL) return;
if(lista->next) wypisz_liste_odwrotnie(lista->next, strum);
fprintf(strum, "%p\n", *wsk->val);
}
int jest_pierwsza(List *lista, int liczba)
{
wsk = lista;
while (wsk != NULL) {
Linia 497 ⟶ 525:
Funkcja ta działa poprawnie tylko wtedy, gdy nie chcemy usuwać pierwszego elementu. Można to poprawić - dodając instrukcję warunkową do funkcji lub dodając do listy "głowę" - pierwszy element nie przechowujący niczego, ale upraszczający operacje na liście. Zostawiamy to do samodzielnej pracy.
<noinclude>{{Nawigacja|C|
|