#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ć.