Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Książka telefoniczna na wskaźnikach (lista jednokierunkowa)

Ostatnio zmodyfikowano 2012-01-27 15:30
Autor Wiadomość
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ąć :)

C/C++
struct Person {
    //..
    ~Person() {
        delete next;
    }
};
Wtedy tylko
C/C++
delete poczatek;
poczatek = NULL;
P-49306
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
C/C++
#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 )
        {
            //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;
            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()
{
    /*if (poczatek!=NULL)
        {
            osoba *deleted = poczatek;
            while(deleted->next!=NULL)
            {
                deleted->isdelete = false;
                deleted = deleted->next;
            }
   
        }
        */
    delete poczatek;
    poczatek = NULL;
    cout << "Lista wyczyszczona" << endl;
   
   
}

void edytuj_osobe()
{
    cout << "\t Wybrałes opcje edycji osoby" << endl;
}
P-49317
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
C/C++
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
P-49321
pekfos
» 2012-01-24 18:01:03
C/C++
osoba()
{
    delete next;
}
..
~osoba()
..
P-49322
hello_world
Temat założony przez niniejszego użytkownika
» 2012-01-24 20:47:34
C/C++
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?
P-49351
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
P-49352
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
C/C++
#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]
P-49497
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.
P-49506
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona