Wałaszek na swojej stronie prezentuje listę jednokierunkową i dwukierunkową
Zaznaczył że nie uwzględnia on obsługi błędów
Jakie mogłyby to być błędy i czy macie jakieś pomysły na ich obsłużenie
Podaj link do tej strony.
To ta strona
http://eduinf.waw.pl/inf/alg/001_search/0083.php
Jakie mogłyby to być błędy [...]
Na przykład, jeśli API do obsługi mechanizmu listy pozwala na dostęp do węzłów na podstawie indeksu, błędem będzie podanie indeksu spoza bieżącego zakresu, np. indeks ujemny lub większy od n-1
, gdzie n
to liczba węzłów, indeksowanych od 0
; Takie błędy mogą zaistnieć podczas dodawania elementu do listy, usuwania, swapu itd.;
Inny możliwy błąd to brak wolnej pamięci i niemożność jej zaalokowania dla nowego węzła, choć w dzisiejszych czasach to raczej niemożliwe; Chyba że urządzenie posiada minimalną ilość pamięci;
[...] czy macie jakieś pomysły na ich obsłużenie
Standardowo - warunki, wyjątki.
Dostęp do elementów listy jest raczej sekwencyjny
W Pascalu są wyjątki
To trochę zbyt ogólnie
Może przejrzeć jego kod/pseudokod procedura po procedurze i dopisać do nich parę warunków czy linijek do pseudokodu
tak aby dopisać tę obsługę błędów
Jak się robi taką bieda-listę jak w tym artykule, czyli kupkę globalnych procedur/funkcji przeznaczonych do konkretnego typu danych to szkoda czasu na jej zabezpieczanie;
Swój post napisałem w odniesieniu do stworzenia konkretnego interfejsu, umożliwiającego wykorzystanie samego mechanizmu listy do przechowywania dowolnego typu danych; Dzięki temu ten interfejs może maskować wewnętrzne iteracje po liście, zwalniać użytkownika z babrania się w ręczną alokację pamięci dla głowy i pozostałych węzłów, a także uprościć dostęp do elementów listy poprzez pobieranie od użytkownika indeksu elementu;
Najpopularniejszym sposobem jest stworzenie klasy opakowującej całość i udostępniającej szereg metod i właściwości do zabawy z listą; Przykłady dotyczące Free Pascala znajdziesz w poniższych artykułach:
Poza tym zgodnie z metodyką nauczania zaczyna się od podejścia strukturalnego
W Pascalu którym pisałem procedury/funkcje do obsługi listy czy jakiejś innej struktury to mogliśmy co najwyżej wrzucić do modułu
unit nazwa;
interface
{dyrektywy kompilatora, deklaracje modułów pomocniczych,
deklaracje typów, stałych, nagłówki procedur i funkcji}
implementation
{procedury i funkcje których nagłówki nie zostały wymienione w części interface
nagłówki funkcji i procedur razem z ciałami }
begin
end.
Nawet używając tylko i wyłącznie programowania strukturalnego, implementację listy jednokierunkowej czy dwukierunkowej można napisać tak, aby użycie takiej listy nie było związane z ręczną alokacją pamięci dla węzłów i jej zwalnianiem;
Natomiast sama lista powinna być strukturką zawierającą wszystkie potrzebne informacje (czyli np. wskaźnik na głowę, wskaźnik na ogon, liczba węzłów itd.), a nie gołym wskaźnikiem na głowę listy;
Poza tym autor tego artykułu stosuje identyczne formatowanie kodu dla wszystkich języków, co fatalnie wygląda w przykładach kodu we Free Pascalu i Free Basicu.
Wałaszek ma na swojej stronie dość czytelne pseudokody w postaci listy kroków
a także podaje przykładowy kod jednak nie uwzględnia obsługi błędów
Wałaszek ma na swojej stronie dość czytelne pseudokody w postaci listy kroków
No to jak w końcu, pseudokody czy listy kroków?
a także podaje przykładowy kod jednak nie uwzględnia obsługi błędów
Bo w wielu przypadkach nie jest to konieczne; Jeśli danego fragmentu kodu używa się prawidłowo to obsługa błędów nie jest potrzebna, dlatego że nigdy nie będzie musiała być wykonana;
No dobrze, ale co dalej? Masz jeszcze z czymś problem? Pytaj.
No to weźmy usuwanie
Algorytm usuwania wybranego elementu listy jednokierunkowej
Wejście
head – zmienna wskazująca początek listy
e – wskazanie elementu listy do usunięcia
Wyjście:
Lista bez elementu wskazywanego przez e.
Dane pomocnicze:
p – wskazania elementu listy
Lista kroków:
K01: Jeśli head ≠ e, to idź do K04 ; sprawdzamy, czy usuwany element jest pierwszym na liście
K02: Usuń pierwszy element listy ; jeśli tak, usuwamy go z listy
K03: Zakończ
K04: p ← head ; w p ustawiamy początek listy
K05: Dopóki (p→next) ≠ e, wykonuj p ← (p→next) ; w p ustawiamy adres elementu poprzedzającego e
K06: (p→next) ← (e→next) ; odłączamy e od listy
K07: Usuń z pamięci element wskazywany przez e
K08: Zakończ
Co jeśli wskaźnik jest ustawiony na NULL
albo nie pokazuje na element listy
Inne błędy nie przychodzą mi do głowy