Witam, mam pewien problem.
Nie mogę zrozumieć pewnej rzeczy związanej z przestawianiem wskaźników w liście jednokierunkowej, chciałbym o wytłumaczenie tego zagadnienia, a oto kod:
#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;
void usun_obiekt(string nazwa_obiektu);
struct Obiekt
{
string nazwa;
string polozenie;
int ilosc;
int masa;
int moc;
int indeks;
Obiekt *nowy_obiekt;
};
Obiekt *dostepny_obiekty = NULL;
Obiekt *generujObiekt(string nazwa, string polozenie, int ilosc, int masa, int moc, int indeks)
{
Obiekt *cos = new Obiekt;
cos->nazwa = nazwa;
cos->polozenie = polozenie;
cos->ilosc = ilosc;
cos->masa = masa;
cos->moc = moc;
cos->indeks = indeks;
cos->nowy_obiekt = dostepny_obiekty;
dostepny_obiekty = cos;
return cos;
}
int main()
{
Obiekt *lista_obiektow; lista_obiektow = dostepny_obiekty;
Obiekt *ten_obiekt;
string nazwa;
string polozenie;
int ilosc;
int masa;
int moc;
int indeks = 1;
while(true)
{
cout << "Witaj uzytkowniku! Stworz obiekt :)"; Sleep(3000); system("cls");
cout << "Nazwa obiektu: "; cin >> nazwa; if(nazwa == "stop") break;
cout << "Polozenie obiektu: "; cin >> polozenie;
cout << "Ilosc tego obiektu: "; cin >> ilosc;
cout << "Masa tego obiektu: "; cin >> masa;
cout << "Moc tego obiektu: "; cin >> moc;
ten_obiekt = generujObiekt(nazwa, polozenie, ilosc, masa, moc, indeks);
indeks++;
}
system("cls");
lista_obiektow = dostepny_obiekty; //Aktualizujemy liste obiektow
cout << "+--------------------------------------------+\n\n STATYSTYKI\n\n";
while(lista_obiektow != NULL)
{
cout << "Obiekt: " << lista_obiektow->nazwa << " [" << lista_obiektow->indeks << "]\n\n";
cout << " *Polozenie obiektu: " << lista_obiektow->polozenie << "\n";
cout << " *Dostepna ilosc tego obiektu: " << lista_obiektow->ilosc << "\n";
cout << " *Masa tego obiektu: " << lista_obiektow->masa << "\n";
cout << " *Moc tego obiektu: " << lista_obiektow->moc << "\n";
lista_obiektow = lista_obiektow->nowy_obiekt; cout << "\n\n";
}
cout << "+--------------------------------------------+\n\n"; string nazwa_usun;
Sleep(8000); cout << "\n\n\nJaki element chcesz usunac?\nWpisz jego nazwe: ";
cin >> nazwa_usun;
usun_obiekt(nazwa_usun); cout << "\n\nA oto aktualna lista obiekow!"; Sleep(1500); cout << "\n\n\n";
lista_obiektow = dostepny_obiekty;
cout << "+--------------------------------------------+\n\n STATYSTYKI\n\n";
while(lista_obiektow != NULL)
{
cout << "Obiekt: " << lista_obiektow->nazwa << " [" << lista_obiektow->indeks << "]\n\n";
cout << " *Polozenie obiektu: " << lista_obiektow->polozenie << "\n";
cout << " *Dostepna ilosc tego obiektu: " << lista_obiektow->ilosc << "\n";
cout << " *Masa tego obiektu: " << lista_obiektow->masa << "\n";
cout << " *Moc tego obiektu: " << lista_obiektow->moc << "\n";
lista_obiektow = lista_obiektow->nowy_obiekt; cout << "\n\n";
}
cout << "+--------------------------------------------+\n\n";
}
void usun_obiekt(string nazwa_obiektu)
{
Obiekt *lista_obiektow;
lista_obiektow = dostepny_obiekty;
Obiekt *zapisz_tymczasowo;
while(true)
{
lista_obiektow = lista_obiektow->nowy_obiekt;
if(lista_obiektow->nowy_obiekt->nazwa == nazwa_obiektu) //Dochodzimy do wskaznika, za ktorym jest obiekt, ktorego szukamy
{
// ---> Dlaczego nie mozna tak zrobic?
lista_obiektow = lista_obiektow->nowy_obiekt->nowy_obiekt;
//zapisz_tymczasowo = lista_obiektow->nowy_obiekt;
//lista_obiektow = lista_obiektow->nowy_obiekt->nowy_obiekt;
//delete zapisz_tymczasowo->nowy_obiekt;
break;
}
}
}
Nie mogę zrozumieć w jaki sposób mam usunąć element z takiej listy, próbowałem już na różne sposoby, ale nie mogłem do tego dojść. Za każdym razem próbuję się dostać do pamięci, której już nie ma/nie mam do niej dostępu, ponieważ nie mogę tego dobrze ustawić. Czy mógłby mi ktoś podpowiedzieć, w jaki prawidłowo przestawić wskaźniki i wytłumaczyć mi pokrótce, dlaczego akurat tak? To miejsce znajduje się w warunku funkcji usun_obiekt(string nazwa_obiektu). Z góry dziękuję!
W poleceniu mam napisane (jest to polecenie do zadania, którym jest ten kod) tak: "(...) Funkcja usuwająca powinna przyjmować tylko element przeznaczony do skasowania. Czy taka funkcja jest łatwa do napisania i czy będzie szybka? Czy można ją uprościć albo przyspieszyć, umieszczając w niej dodatkowy wskaźnik do listy?"
Nie wiem czy dobrze rozumiem, ale autorowi chodziło o wskaźnik do poprzedniego elementu listy, mylę się? Ja coś próbowałem z zapisem elementu, który znajduje się idealnie przed elementem, który chcę usunąć, ale raczej nie o to chodzi, bo nie działało to wcale w dobry sposób :D