jdkrrrrr Temat założony przez niniejszego użytkownika |
Usuwanie wybranego elementu listy » 2018-05-18 22:36:35 Witam, potrzebuje napisać funkcję, która będzie usuwać element listy jednokierunkowej, który wyszukam na podstawie zmiennej wiek(czyli if(wsk->wiek==10)...usun ten element). Dodam, że dopiero uczę się list, więc proszę o możliwie łatwe do zrozumienia wytłumaczenie zagadnienia. Mój dotychczasowy kod z funkcją dodawania: struct person { person * next; string imie; int wiek; }; person * head; person * tmp;
void dodaj() { tmp = new person; cout << "Podaj imie: "; cin >> tmp->imie; cout << "Podaj wiek: "; cin >> tmp->wiek; tmp->next = NULL; if( head == NULL ) head = tmp; else { person * ptr = head; while( ptr->next ) ptr = ptr->next; ptr->next = tmp; tmp->next = NULL; } }
|
|
pekfos |
» 2018-05-18 22:49:28 Będzie prościej jak podasz, z czym masz problem. Usuwanie z listy wymaga tylko przestawienia wskaźników, upewnij się że algorytm jest poprawny dla usuwania elementu z początku, środka i końca listy. |
|
jdkrrrrr Temat założony przez niniejszego użytkownika |
» 2018-05-19 00:16:04 Problem jest taki, że nie wiem jak przestawić wskaźniki tak żeby to miało ręce i nogi. Mój prototyp funkcji usun: void usun() { person * wsk = head; if( wsk != NULL ) { while( wsk != NULL ) { if( wsk->wiek == 10 ) { free( wsk ); } wsk = wsk->next; } } else cout << "\nLista jest pusta\n"; }
|
|
pekfos |
» 2018-05-19 00:30:43 Problem jest taki, że nie wiem jak przestawić wskaźniki tak żeby to miało ręce i nogi. |
W liście A -> B -> C, by usunąć B, wystarczy by A wskazywało na C. |
|
jdkrrrrr Temat założony przez niniejszego użytkownika |
» 2018-05-19 09:56:51 Wiem już jak usunąć szukany element gdy jest pierwszy lub ostatni na liście, jednak nie potrafię napisać kodu, który usuwałby szukany element pomiędzy pierwszym a ostatnim. Kod: void usun() { person * poprzedni = NULL; person * tmp; person * wsk = head; if( wsk == NULL ) { cout << "\nLista jest pusta\n"; } else { if( head->wiek == 10 ) { tmp = head->next; delete head; head = tmp; } else { while( wsk->next ) { poprzedni = wsk; wsk = wsk->next; } if( wsk->wiek == 10 ) { poprzedni->next = NULL; delete wsk; } } } }
|
|
pekfos |
» 2018-05-19 11:12:45 W liście jednokierunkowej usuwanie ze środka i końca realizuje ten sam algorytm. |
|
jdkrrrrr Temat założony przez niniejszego użytkownika |
» 2018-05-19 14:30:25 Problem rozwiązany, dziękuje za porady :)
Mam jeszcze jedno zagadnienie dotyczące funkcji dodaj. Ma działać tak, żeby każda nowa osoba była dodawana na 3 miejsce listy(gdy 2 poprzednie osoby są już dodane). Czyli jeżeli dodam czwartą osobę to zamieni się ona miejscami z trzecią osobą w liście.
|
|
pekfos |
» 2018-05-19 15:01:02 To szukaj ostatniego miejsca na liście, ale przechodząc przez maksymalnie 2 elementy. Dodanie w środek i na koniec w liście jednokierunkowej realizuje ten sam algorytm. |
|
« 1 » |