Nadesłany przez Marian, 01 marca 2011 02:28
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
lista_1_c.cpp:
// implementacja wizytownika w postaci listy jednokierunkowej // dane sortowane sa alfabetycznie wg nazwiska // www.algorytm.org #include<iostream> using namespace std; #include<string> struct Wizytowka // struktura reprezentujaca pojedyncza wizytowke { string imie; string nazwisko; int numer_telefonu; Wizytowka *nastepny; // wskaznik na nastepny element na liscie Wizytowka() // konstruktor - wywolywany przy tworzeniu obiektu { // wczytujemy dane cout << "Podaj imie: "; cin >> imie; cout << "Podaj nazwisko: "; cin >> nazwisko; cout << "Podaj numer telefonu (bez zera na poczatku): "; cin >> numer_telefonu; // wskazniki ustawiamy na NULL nastepny = NULL; } void wypisz() { cout << "Imie: " << imie << "\tNazwisko: " << nazwisko << "\tNumer telefonu: " << numer_telefonu << endl; } }; void dodaj_wizytowke(Wizytowka **korzen) { Wizytowka *nowa = new Wizytowka; // utworzenie nowej wizytowki Wizytowka *pomoc = (*korzen), *pomoc1 = NULL; // wskazniki pomocnicze posluza do poruszania sie po liscie while (pomoc != NULL && (pomoc->nazwisko).compare(nowa->nazwisko) == -1) // dopoki nie wyszlismy za liste i nazwisko na liscie jest przed nowym nazwiskiem poruszamy sie dalej { pomoc1 = pomoc; // pomoc1 zawsze wskazuje poprzednika pomoc pomoc = pomoc->nastepny; } if (pomoc != NULL && (pomoc->nazwisko).compare(nowa->nazwisko) == 0) // wizytowka z podanym nazwiskiem juz istanieje { cout << "Wizytowka " << nowa->nazwisko << " juz istanieje w wizytowniku\n"; delete nowa; // usuniecie obiektu } else if ((*korzen) == NULL || (pomoc == (*korzen) && (pomoc->nazwisko).compare(nowa->nazwisko) == 1)) // nowy element bedzie korzeniem listy { nowa->nastepny = (*korzen); (*korzen) = nowa; } else // dodajemy wizytowke w srodku lub na koncu listy { pomoc1->nastepny = nowa; nowa->nastepny = pomoc; } } void wyszukaj_wizytowke(Wizytowka *korzen, string a) { while(korzen != NULL && (korzen->nazwisko).compare(a) != 0) // dopoki nie znajdziemy wizytowki z podanym nazwiskiem lub nie przeszukamy calego wizytownika korzen = korzen->nastepny; if (korzen == NULL) cout << "Nie ma wizytowki " << a << endl; else korzen->wypisz(); } void wypisz_wizytownik(Wizytowka *korzen) { cout << "Zawartosc wizytownika:\n"; while(korzen != NULL) { korzen->wypisz(); // wypisanie wizytowki korzen = korzen->nastepny; // przejscie na kolejny element } } bool usun_wizytowke(Wizytowka **korzen, string a) { if ((*korzen) == NULL) // lista jest pusta return false; Wizytowka *pomoc = (*korzen), *pomoc1 = NULL; // wskazniki pomocnicze posluza do poruszania sie po liscie while(pomoc != NULL && (pomoc->nazwisko).compare(a) != 0) // dopoki nie znajdziemy wizytowki z podanym nazwiskiem lub nie przeszukamy calego wizytownika { pomoc1 = pomoc; pomoc = pomoc->nastepny; } if (pomoc == NULL) // wyszlismy za liste - nie ma takiego nazwiska na liscie return false; else if (pomoc == (*korzen)) // usuwamy koniec { (*korzen) = (*korzen)->nastepny; delete pomoc; } else // usuwamy z srodka lub konca listy { pomoc1->nastepny = pomoc->nastepny; delete pomoc; } return true; } int main() { char instrukcja; string nazwisko; Wizytowka *korzen = NULL; // korzen listy - wskaznik na pierwszy element cout << "MENU - mozliwe operacje na wizytowniku\n" << "d - dodanie wizytowki\n" << "s - wyszukanie wizytowki\n" << "w - wypisanie wszystkich wizytowek\n" << "u - usuniecie wizytowki\n" << "Ctrl+Z - koniec programu\n"; while (cin >> instrukcja) { switch (instrukcja) { case 'd': dodaj_wizytowke(&korzen); break; case 's': cout << "Podaj nazwisko: "; cin >> nazwisko; wyszukaj_wizytowke(korzen, nazwisko); break; case 'w': wypisz_wizytownik(korzen); break; case 'u': cout << "Podaj nazwisko: "; cin >> nazwisko; if (!usun_wizytowke(&korzen, nazwisko)) cout << "Nie odnaleziono wizytowki z podanym nazwiskiem" << endl; else cout << "Wizytowka z podanym nazwiskiem zostala usunieta" << endl; break; default: cout << "Musisz wybrac jedna z opcji: d - dodawanie, s - wyszukiwanie, w - wypisanie zawartosci lub u - usuwanie\n"; break; } } return 0; }