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 10:11:02
Tak jak się usuwa z listy. Znajdujesz element poprzedni, wskaźnik next ustawiasz na element następny i aktualny usuwasz.
P-49270
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.
P-49271
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.
C/C++
void pokaz_wszystkie()
{
    if( poczatek != NULL )
    {
        osoba * pokaz = poczatek;
       
        while( pokaz->next != NULL )
        {
            if( pokaz->isdelete = true ) //dodalem tutaj
            {
                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; //tutaj odpisałem
            }
        }
        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
C/C++
struct osoba
{
    char imie[ 20 ];
    char nazwisko[ 30 ];
    char miasto[ 25 ];
    char ulica[ 30 ];
    char telefon[ 9 ];
    bool isdelete; //tutaj dopisałem
    osoba * next;
};
P-49276
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
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 * 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;
}
P-49294
pekfos
» 2012-01-24 14:42:14
C/C++
osoba * pokaz = poczatek;
if( pokaz->isdelete != false )
{
Nie rozumiesz swojego kodu..
P-49296
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
C/C++
if( poczatek != NULL )
Jeżeli wskaznik "początek" wskazujący na strukturę "osoba" równa się NULL(czyli 0) to:

C/C++
osoba * pokaz = poczatek;
To stwórz nowy wskaźnik "pokaz" na strukturę "osoba" i nadaj mu wartość wskaźnika "początek"
C/C++
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
C/C++
if( pokaz->isdelete != false )
W pętli zobacz czy element struktury oznaczony jako isdelete jest true
C/C++
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

C/C++
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

P-49301
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 .."
P-49303
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.
C/C++
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?
P-49304
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona