[C++] Książka telefoniczna na wskaźnikach (lista jednokierunkowa)
Ostatnio zmodyfikowano 2012-01-27 15:30
pekfos |
» 2012-01-24 16:35:16 Za to już powinien być grom z jasnego nieba :P Przy usuwaniu wszystkich o wiele prościej było by to normalnie usunąć :) struct Person { ~Person() { delete next; } }; Wtedy tylko delete poczatek; poczatek = NULL; |
|
hello_world Temat założony przez niniejszego użytkownika |
» 2012-01-24 17:17:46 @pekfos Dziękuję za podpowiedź, działa tak jak ma być. Mam tylko problem z wyobrażeniem tego. Czyli w strukturze tworzy się funkcję która usunie wskaznik next, który wskazuje na obiket struktury osoba Z kolei w funkcji usun_wszystkie() usuwamy wskaznik który tez wskazuje na obiekt struktury osoba. Jak powiązane sa komendy z funkcji usun_wszystkie z funkcją w strukturze #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() { delete 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; 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; } cout << "-----\n" << pokaz->imie << endl; cout << pokaz->nazwisko << endl; cout << pokaz->miasto << endl; cout << pokaz->ulica << endl; cout << pokaz->telefon << endl; } }
void usun_osobe() { }
void usun_wszystkich() { delete poczatek; poczatek = NULL; cout << "Lista wyczyszczona" << endl; }
void edytuj_osobe() { cout << "\t Wybrałes opcje edycji osoby" << endl; }
|
|
hello_world Temat założony przez niniejszego użytkownika |
» 2012-01-24 17:55:33 Teraz funkcja usun_osobę() Wydaje mi się że najlepszym kryterium bedzie nr.telefonu Wiec mam taki kod void usun_osobe() { string szukacz; cout << "Podaj numer telefonu do wyszukania \t"; cin >> szukacz; osoba * pokaz = poczatek; while( pokaz->next != NULL ) { if( pokaz->next->telefon == szukacz ) { osoba * usuwany = pokaz->next; pokaz->next = usuwany->next; delete usuwany; } else { pokaz = pokaz->next; } } }
i teraz usuwa mi osoby ale jak mam jedną to mi tej osoby nie usuwa |
|
pekfos |
» 2012-01-24 18:01:03 |
|
hello_world Temat założony przez niniejszego użytkownika |
» 2012-01-24 20:47:34 void usun_osobe() { string szukacz; cout << "Podaj numer telefonu do wyszukania \t"; cin >> szukacz; osoba * pokaz = poczatek; while( pokaz->next != NULL ) { if( pokaz->next->telefon == szukacz ) { osoba * usuwany = pokaz->next; pokaz->next = usuwany->next; delete usuwany; } pokaz = pokaz->next; } if( pokaz->telefon == szukacz ) { osoba * usuwany = pokaz->next; pokaz->next = usuwany->next; delete usuwany; } } Segmentation fault. Już mi czacha dymi. Jak usunąć pierwszy element listy? |
|
pekfos |
» 2012-01-24 20:52:54 Jak usunąć pierwszy element listy? |
Zacząć szukać od pierwszego elementu a nie od drugiego? Dużo nie wyniosłeś z naszych odpowiedzi :P |
|
hello_world Temat założony przez niniejszego użytkownika |
» 2012-01-26 14:00:33 No niestety wskazniki mnie zabijają, więc zacząłem problem drążyć z użyciem pliku (w sumie to trzeba oprzeć o plik lub bazę) Mam kod #include <iostream> #include <fstream> #include <iomanip>
using namespace std;
inline void eatline() { while( std::cin.get() != '#' ) continue; } struct osoba { char imie[ 20 ]; char nazwisko[ 30 ]; char telefon[ 9 ]; } nowa; const char * plik = "/home/user/baza.dat";
void odczyt_pliku() { cout << right; ifstream fin; fin.clear(); fin.open( plik, ios_base::in | ios_base::binary ); if( fin.is_open() ) { cout << "Oto nowa zawartość pliku: " << plik << endl; while( fin.read(( char * ) & nowa, sizeof nowa ) ) { cout << setw( 20 ) << nowa.imie << setw( 30 ) << nowa.nazwisko << setw( 9 ) << nowa.telefon << endl; } } fin.close(); }
void zapis_dopliku() { ofstream fout( plik, ios_base::out | ios_base::app | ios_base::binary ); if( !fout.is_open() ) { cerr << "Nie można otworzyć pliku " << plik << " do zapisu.\n"; } cout << "Podaj imię (aby zakonczyć wprowadź znak #): "; cin.clear(); cin.get( nowa.imie, 20 ); while( nowa.imie[ 0 ] != '#' ) { cout << "Podaj nazwisko: "; cin >> nowa.nazwisko; cout << "Podaj numer telefonu: "; cin >> nowa.telefon; eatline(); fout.write(( char * ) & nowa, sizeof nowa ); cout << "Podaj imię (aby zakonczyć wprowadź znak #):\n"; cin.get( nowa.imie, 20 ); } }
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. Pokaż wszystkie osoby" << 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: zapis_dopliku(); break; case 2: odczyt_pliku(); 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; } Funkcja zapis_dopliku() uniemożliwia mi wprowadzenie osoby. Objawy: jak wpiszę imie to nie przechodzi do nazwiska. Mam wrażenie że wejście na wywołaniu coś ma w nowa.imie[0]. Jak sprawdzić, albo jak wyczyścić (jeżeli się nie mylę) wejście. Użyłem cin.clear() ale to nic nie daje. Pozdrawiam[/code] |
|
hello_world Temat założony przez niniejszego użytkownika |
» 2012-01-26 16:12:32 Chyba wiem gdzie jest błąd tylko nie wiem jak go rozwiązać. W momencie pobrania z menu opcji podaje numer i klepię enter. Wydaje mi się że ten enter nie jest obcinany. Jeżeli ktoś może sie wypowiedzieć będę wdzięczny. |
|
1 2 « 3 » 4 |