[C++] Książka telefoniczna na wskaźnikach (lista jednokierunkowa)
Ostatnio zmodyfikowano 2012-01-27 15:30
pekfos |
» 2012-01-24 10:11:02 Tak jak się usuwa z listy. Znajdujesz element poprzedni, wskaźnik next ustawiasz na element następny i aktualny usuwasz. |
|
RazzorFlame |
» 2012-01-24 10:22:00 Ja ta funkcje usuwania wszystkich bym zrobił tak:
Dodałbym do struct osoba jeszcze jedna zmienna typu bool (np isdeleted) i gdy wybierzesz tą opcje (usun wszystkich) to wszystkim ta zmienna daje na isdeleted = true; Wtedy robisz tak ze wyswietla osoby jezeli ich isdeleted jest false. |
|
hello_world Temat założony przez niniejszego użytkownika |
» 2012-01-24 12:12:26 @pekfos Nie wiem czy potrafię tą myśl przelac na kod. Co do funkcji usun_wszystkich to robie to tak ale jak wybiorę opcję 4 to dalej mi wszystkich pokazuje. void pokaz_wszystkie() { if( poczatek != NULL ) { osoba * pokaz = poczatek; while( pokaz->next != NULL ) { if( pokaz->isdelete = true ) { cout << "-----\n" << pokaz->imie << endl; cout << pokaz->nazwisko << endl; cout << pokaz->miasto << endl; cout << pokaz->ulica << endl; cout << pokaz->telefon << endl; pokaz = pokaz->next; } else { cout << "Brak danych." << endl; } } cout << "-----\n" << pokaz->imie << endl; cout << pokaz->nazwisko << endl; cout << pokaz->miasto << endl; cout << pokaz->ulica << endl; cout << pokaz->telefon << endl; } }
void usun_wszystkich() { if( poczatek != NULL ) { osoba * deleted = poczatek; while( deleted->next != NULL ) { deleted->isdelete = false; deleted = deleted->next; } } cout << "Lista wyczyszczona" << endl; }
A to zmieniona struktura struct osoba { char imie[ 20 ]; char nazwisko[ 30 ]; char miasto[ 25 ]; char ulica[ 30 ]; char telefon[ 9 ]; bool isdelete; osoba * next; };
|
|
hello_world Temat założony przez niniejszego użytkownika |
» 2012-01-24 14:35:42 Teraz mam tak, że jak dodam kilka osób i wybiorę funkcję usun_wszystkich(), to owszem usuwa wszystko ale jak dodaje dalej nowe osoby i wyświetlam funkcję pokaz_wszystkich() to pokazuje mi "Brak danych". Zgłupiałem #include <iostream> #include <string> using namespace std;
void dodaj_osobe(); void wyszukaj_nazwisko(); void wyszukaj_telefon(); void pokaz_wszystkie(); void usun_osobe(); void usun_wszystkich(); void edytuj_osobe();
struct osoba { char imie[ 20 ]; char nazwisko[ 30 ]; char miasto[ 25 ]; char ulica[ 30 ]; char telefon[ 9 ]; bool isdelete; osoba * next; }; osoba * poczatek = NULL;
int main() { int tmp = 0; do { cout << "\n\t KSIĄŻKA TELEFONICZNA v0.1" << endl; cout << "" << endl; cout << "Aby używać książkę telefoniczną wybierz odpowiednie liczby" << endl; cout << "" << endl; cout << "\t 1. Dodaj osobę" << endl; cout << "\t 2. Wyszukaj osobę po nazwisku" << endl; cout << "\t 3. Wyszukaj osobę po nr. telefonu" << endl; cout << "\t 4. Pokaż wszystkie osoby" << endl; cout << "\t 5. Usun osobę" << endl; cout << "\t 6. Usuń wszystkie osoby" << endl; cout << "\t 7. Edytuj osobę" << endl; cout << "\t 0. Zakoncz program" << endl; cin >> tmp; cout << "\t << Wybrałeś/aś opcję " << tmp << " >> " << endl; cout << "" << endl; switch( tmp ) { case 0: cout << "\t << KONIEC PROGRAMU >>" << endl; break; case 1: dodaj_osobe(); break; case 2: wyszukaj_nazwisko(); break; case 3: wyszukaj_telefon(); break; case 4: pokaz_wszystkie(); break; case 5: usun_osobe(); break; case 6: usun_wszystkich(); break; case 7: edytuj_osobe(); break; default: cout << "\t << Wybrałeś/aś opcję różną od 1-7 >>" << endl; cout << "\t << Wybierz jeszcze raz odpowiednią opcję >>" << endl; cout << "" << endl; break; } } while( tmp != 0 ); return 0; }
void dodaj_osobe() { osoba * nowa = new osoba; nowa->next = NULL; cout << "Podaj imię \t"; cin >> nowa->imie; cout << "Podaj nazwisko \t"; cin >> nowa->nazwisko; cout << "Podaj miasto \t"; cin >> nowa->miasto; cout << "Podaj ulicę \t"; cin >> nowa->ulica; cout << "Podaj numer telefonu \t"; cin >> nowa->telefon; nowa->isdelete = true; if( poczatek == NULL ) { poczatek = nowa; } else { osoba * szukaj = poczatek; while( szukaj->next != NULL ) { szukaj = szukaj->next; } szukaj->next = nowa; } }
void wyszukaj_nazwisko() { string szukacz; cout << "Podaj nazwisko do wyszukania \t"; cin >> szukacz; osoba * pokaz = poczatek; while( pokaz->next != NULL ) { if( pokaz->nazwisko == szukacz ) { cout << "Imię: " << pokaz->imie << endl << "Nazwisko: " << pokaz->nazwisko << endl << "Miasto: " << pokaz->miasto << endl << "Ulica: " << pokaz->ulica << endl << "Telefon: " << pokaz->telefon << endl; } pokaz = pokaz->next; } if( pokaz->nazwisko == szukacz ) { cout << "Imię: " << pokaz->imie << endl << "Nazwisko: " << pokaz->nazwisko << endl << "Miasto: " << pokaz->miasto << endl << "Ulica: " << pokaz->ulica << endl << "Telefon: " << pokaz->telefon << endl; } else { cout << "Brak takiej osoby" << endl; } }
void wyszukaj_telefon() { string szukacz; cout << "Podaj numer telefonu do wyszukania \t"; cin >> szukacz; osoba * pokaz = poczatek; while( pokaz->next != NULL ) { if( pokaz->telefon == szukacz ) { cout << "Imię: " << pokaz->imie << endl << "Nazwisko: " << pokaz->nazwisko << endl << "Miasto: " << pokaz->miasto << endl << "Ulica: " << pokaz->ulica << endl << "Telefon: " << pokaz->telefon << endl; } pokaz = pokaz->next; } if( pokaz->telefon == szukacz ) { cout << "Imię: " << pokaz->imie << endl << "Nazwisko: " << pokaz->nazwisko << endl << "Miasto: " << pokaz->miasto << endl << "Ulica: " << pokaz->ulica << endl << "Telefon: " << pokaz->telefon << endl; } else { cout << "Brak takiej osoby" << endl; } }
void pokaz_wszystkie() { if( poczatek != NULL ) { osoba * pokaz = poczatek; if( pokaz->isdelete != false ) { while( pokaz->next != NULL ) { cout << "-----\n" << pokaz->imie << endl; cout << pokaz->nazwisko << endl; cout << pokaz->miasto << endl; cout << pokaz->ulica << endl; cout << pokaz->telefon << endl; pokaz = pokaz->next; } } else { cout << "Brak danych" << endl; } if( pokaz->isdelete != false ) { cout << "-----\n" << pokaz->imie << endl; cout << pokaz->nazwisko << endl; cout << pokaz->miasto << endl; cout << pokaz->ulica << endl; cout << pokaz->telefon << endl; } else { cout << "Brak danych" << endl; } } }
void usun_osobe() { }
void usun_wszystkich() { if( poczatek != NULL ) { osoba * deleted = poczatek; while( deleted->next != NULL ) { deleted->isdelete = false; deleted = deleted->next; } } cout << "Lista wyczyszczona" << endl; }
void edytuj_osobe() { cout << "\t Wybrałes opcje edycji osoby" << endl; }
|
|
pekfos |
» 2012-01-24 14:42:14 osoba * pokaz = poczatek; if( pokaz->isdelete != false ) { Nie rozumiesz swojego kodu.. |
|
hello_world Temat założony przez niniejszego użytkownika |
» 2012-01-24 15:21:07 To ja wiem (jedyna rzecz :)) Może napiszę słownie co rozumie, a wy mnie poprawcie gdzie robię błąd Trochę zmieniłem kod więc dostosuje się do tego co nowe Jeżeli wskaznik "początek" wskazujący na strukturę "osoba" równa się NULL(czyli 0) to: osoba * pokaz = poczatek;
To stwórz nowy wskaźnik "pokaz" na strukturę "osoba" i nadaj mu wartość wskaźnika "początek" while( pokaz->next != NULL )
To stwórz pętle while, która będzie aktywna kiedy elementy listy nie będą NULL czyli jak dany elementy listy będzie istniał to pracuj if( pokaz->isdelete != false )
W pętli zobacz czy element struktury oznaczony jako isdelete jest true cout << "-----\n" << pokaz->imie << endl; cout << pokaz->nazwisko << endl; cout << pokaz->miasto << endl; cout << pokaz->ulica << endl; cout << pokaz->telefon << endl; pokaz = pokaz->next;
Jeżeli tak to wypisz na konsolę składowe tej struktury i przejdź do następnego elementu listy if( poczatek != NULL ) {.... cout << "-----\n" << pokaz->imie << endl; cout << pokaz->nazwisko << endl; cout << pokaz->miasto << endl; cout << pokaz->ulica << endl; cout << pokaz->telefon << endl; }
Tak czy inaczej wyświetl chociaż pierwszy element listy. Bez tego pokazuje >=2 elementów listy |
|
pekfos |
» 2012-01-24 15:25:49 jeżeli wskaznik "początek" wskazujący na strukturę "osoba" równa się NULL |
.. Jak równa się NULL to na nic nie wskazuje. Operator != oznacza ".. jest różne od .." |
|
hello_world Temat założony przez niniejszego użytkownika |
» 2012-01-24 15:35:46 Oczywiście przeciez w kodzie mam != To pokazuje jaki już mam chaos w głowie. Pytanie czy moja funkcja usun_wszystkich dobrze działa. void usun_wszystkich() { if( poczatek != NULL ) { osoba * deleted = poczatek; while( deleted->next != NULL ) { deleted->isdelete = false; deleted = deleted->next; } } cout << "Lista wyczyszczona" << endl; } Pytanie jeszcze takie czy nie lepiej zastosować delete dla struktury. Czy delete czyści pamięć przydzielona dla obiektu struktury? |
|
1 « 2 » 3 4 |