goransol napisał(a)
if(tmp->Value==value) /* Sprawdzamy czy nie usywamy 1 element z listy */
{
tmp = tmp->Next;
free(tmp);
--(list->Size);
return 0;
}
To też niestety jest źle. Powiedzmy, że element A ma jako następnik element B. Chcesz usunąć A, przesuwając wcześniej B, jednakże w rzeczywistości nadpisujesz A i usuwasz B, w rezultacie otrzymując memory leak i utratę danych. Chodzi o to, że w momencie wywołania free(), zmienna tmp
wskazuje już na co innego niż to, co chcesz usunąć.
Co do pętli while()... Jest lepiej, ale nie sprawdzasz ostatniego elementu. Problemem jest tutaj warunek (tmp1 = tmp->Next) == NULL
, który powoduje zakończenie funkcji zanim sprawdzisz zawartość tmp1
. Popracuj jeszcze nad tym.
goransol napisał(a)
Nie wiem dlaczego zwracanie wartości -1 czy 0 może wpłynąć na uniemożliwienie użycia funkcji z punktu 5.
Powód jest bardzo prosty. W poprzedniej wersji używałeś -1 do zwrócenia błędu i 0 jeśli wszystko było OK. Problem w tym, że if ( -1 )
daje logiczną prawdę, co staje się bez sensu przy zapisie if (DelElement())
(warunek byłby prawdziwy tylko w przypadku błędu, co źle się odczytuje). Kiedy jednak dodałeś jeszcze -2, przestało to mieć znaczenie. Jeśli funkcja może zwrócić jedną z dwóch wartości, lepiej jest użyć 0 w przypadku błędów i/lub nieudanej operacji oraz 1 jeśli wszystko poszło dobrze.
goransol napisał(a)
Jeśli nie czy można to zapisać w bardziej lukratywny sposób?
Nie rozumiem co masz na myśli pisząc "lukratywny", bo chyba nie pytasz czy da się na nim więcej zarobić? ;)
Jeśli chcesz żeby ten kod był wydajniejszy to da się, ale o ile nie będziesz wykonywał milionów operacji na sekundę na tej liście, nie będzie to miało większego znaczenia. Kompilator pewnie i tak to zoptymalizuje.
Jeśli pytasz czy da się go napisać ładniej, to tutaj nie jest już tak różowo. Z listami powiązanymi jest ten problem, że albo pisze się przejrzysty lecz dość rozwlekły kod ze zmiennymi pomocniczymi, albo tworzy się zwięzłego, semantycznego potworka, omijanego szerokim łukiem przez wszystkich... łącznie z twórcą.
goransol napisał(a)
Kumashiro dzięki za przedstawienie moich błędów... zaczynam dopiero uczyć się struktury danych skąd takie bezmyślne podejście.
Nie nazwałbym tego bezmyślnym podejściem. Nieuważnym, już bardziej. Trudno jednak wymagać pamiętania o wszystkim od kogoś, kto dopiero się uczy. Lista powiązana to nie jest łatwy temat (na początku) i jej tworzenie wymaga dużo skupienia, albo w którymś momencie skończy się to katastrofą. Zapewne dlatego ten temat jest często wykorzystywany na uczelniach jako ćwiczenie. Staraj się analizować dokładnie działanie algorytmu w różnych przypadkach, rób testy, używaj programu typu valgrind do znajdowania wycieków pamięci i będzie OK. No i przede wszystkim nie bój się eksperymentować. Komputer Ci nie wybuchnie jak zrobisz jakiś błąd w kodzie... najwyżej Ci program zeżre cały RAM ;)