Lista u Wałaszka i obsługa błędów

0

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

0

Podaj link do tej strony.

1

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.

0

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

1

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:

0

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.
1

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.

0

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

0

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.

0

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

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