#include <iostream> #include <string> #include <cstdlib> #include <windows.h> using namespace std; struct osoba { string imie; string nazwisko; int wiek; osoba* nastepna; // wskaźnik na następny element osoba(); // konstruktor }; osoba::osoba() { nastepna = 0; // konstruktor } struct lista { osoba* pierwsza; // wskaźnik na początek listy void dodaj_osobe(string imie, string nazwisko, int wiek); void usun_osobe(int nr); void wyswietl_liste(); void usun_osobe_nazwisko(string nazwisko); void znajdz_osobe_nazwisko(string nazwisko); lista(); }; lista::lista() { pierwsza = 0; // konstruktor } void lista::wyswietl_liste() { // wskaznik na pierszy element listy osoba* temp = pierwsza; // przewijamy wskazniki na nastepne elementy while (temp) { cout << "imie: "<< temp->imie << ", nazwisko: "<< temp->nazwisko << ", wiek: "<< temp->wiek << endl; temp = temp->nastepna; } } void lista::usun_osobe(int nr) { // jezeli to pierwszy element listy if (nr == 1) { osoba* temp = pierwsza; pierwsza = temp->nastepna; //ustawiamy poczatek na drugi element delete temp; // usuwamy stary pierwszy element z pamieci } // jeżeli nie jest to pierwszy element else if (nr >= 2) { int j = 1; // do usuniecia srodkowego elemetnu potrzebujemy wskaznika na osobe n-1 // wskaznik *temp bedzie wskaznikiem na osobe poprzedzajaca osobe usuwana osoba* temp = pierwsza; while (temp) { // sprawdzamy czy wskaznik jest na osobie n-1 niz usuwana if ((j + 1) == nr) break; // jezeli nie to przewijamy petle do przodu temp = temp->nastepna; j++; } // wskaznik *temp wskazuje teraz na osobe n-1 // nadpisujemy wkaznik n-1 z osoby n na osobe n+1 // bezpowrotnie tracimy osobe n-ta // jezeli usuwamy ostatni element listy if (temp->nastepna->nastepna == 0) { delete temp->nastepna; temp->nastepna = 0; } // jezeli usuwamy srodkowy element else { osoba* usuwana = temp->nastepna; temp->nastepna = temp->nastepna->nastepna; delete usuwana; } } } void lista::dodaj_osobe(string imie, string nazwisko, int wiek) { osoba* nowa = new osoba; // tworzy nowy element listy // wypełniamy naszymi danymi nowa->imie = imie; nowa->nazwisko = nazwisko; nowa->wiek = wiek; if (pierwsza == 0) // sprawdzamy czy to pierwszy element listy { // jeżeli tak to nowy element jest teraz początkiem listy pierwsza = nowa; } else { // w przeciwnym wypadku wędrujemy na koniec listy osoba* temp = pierwsza; while (temp->nastepna) { // znajdujemy wskaźnik na ostatni element temp = temp->nastepna; } temp->nastepna = nowa; // ostatni element wskazuje na nasz nowy } } void lista::znajdz_osobe_nazwisko(string nazwisko) { } void lista::usun_osobe_nazwisko(string nazwisko) { } int main() { lista* baza = new lista; // tworzymy liste int wybor; string n_imie, n_nazwisko; int n_wiek; int do_usuniecia; string nazwisko_usuwane; string nazwisko_szukane; do { cout << "Co chcesz zrobic?"<< endl; cout << "1. Dodac osobe"<< endl; cout << "2. Usunac osobe po numerze"<< endl; cout << "3. Usunac osobe po nazwisku"<< endl; cout << "4. Wypisac wszystkich"<< endl; cout << "5. Wyszukac osobe po nazwisku"<< endl; cout << "6. Zakonczyc program"<< endl; cin >> wybor; switch (wybor) { case 1: cout << "Podaj imie osoby: "; cin >> n_imie; cout << "Podaj nazwisko osoby: "; cin >> n_nazwisko; cout << "Podaj wiek osoby: "; cin >> n_wiek; baza->dodaj_osobe(n_imie, n_nazwisko, n_wiek); break; case 2: cout << "Podaj numer osoby: "; cin >> do_usuniecia; baza->usun_osobe(do_usuniecia); break; case 3: cout << "Podaj nazwisko: "; cin >> nazwisko_usuwane; baza->usun_osobe_nazwisko(nazwisko_usuwane); break; case 4: baza->wyswietl_liste(); Sleep(5000); break; case 5: cout << "Podaj nazwisko do odszukania: "; cin >> nazwisko_szukane; baza->znajdz_osobe_nazwisko(nazwisko_szukane); break; case 6: exit; } system("CLS"); } while (wybor != 6); return 0; }
Umiałby ktos wytłumaczyc mi jak zrobic w liscie jednokierunkowej w c++ wyszukiwanie i usuwanie uzytkownikow po nazwisku? W wyszukiwaniu myslalem nad zwyklą pętlą for, gdzie iterator operowałby na strukturach w liscie i sprawdzał, czy nazwisko osoby jest takie, jak podane przez użytkownika, tylko nie wiem, jak to napisać.