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

problem z tabela lub struktura

Ostatnio zmodyfikowano 2009-10-31 06:10
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
» 2009-10-21 00:15:12
znalazlem swietny przyklad, teraz na jego przykladzie sprobuje sobie utrwalic stosowanie listy, moze komus przyda sie tez ten program do nauki
C/C++
#include <iostream>
#include <iostream.h>
#include <conio.h>
typedef struct El // struktura elementu roboczego
{ std::string Wartosc;
    struct El * Nastepny; // wska«nik do nast©pnego elementu
} ELEMENT;
typedef struct // struktura elementu informacyjnego(listy)
{ ELEMENT * Glowa;
    ELEMENT * Ogon;
} INFO;

INFO * Lista; // wska«nik do elementu informacyjnego
// dla uproszenia zadeklarowano go
// jako zmienna globalna
void Pisz_Menu();
void Do_Listy( int W );
void Dopisz_K_elem_do_Listy();
void Pisz_Liste();
void Usun_Liste();
//$$$
//$$$
//$$$

//================================================== ===================
void main()
{
    char znak;
   
    Lista = new INFO;
    Lista->Glowa = NULL;
    Lista->Ogon = NULL;
   
    do
    {
        clrscr();
        Pisz_Menu();
        znak = getch();
        switch( znak )
        {
        case '1': Dopisz_K_elem_do_Listy(); break;
        case '2': Pisz_Liste(); break;
        case '3': Usun_Liste(); break;
        case '4':; break; //$$$
        case '5':; break; //$$$
        case '6':; break; //$$$
        }
    }
    while( znak != '7' );
    // koniec programu
    Usun_Liste();
}

//================================================== =======PROCEDURY=====

void Pisz_Menu()
{
    cout << "PRZYKLADOWE OPERACJE NA LISCIE DYNAMICZNEJ\n";
    cout << "1. Dopisz k liczb do listy\n";
    cout << "2. Pokaz cala liste\n";
    cout << "3. Usun cala liste\n";
    cout << "4. Pokaz elementy parzyste w liscie\n";
    cout << "5. Usun k elementow poczatkowych z listy\n";
    cout << "6. Zapisz liste na plik tekstowy\n";
    cout << "7. Zakoncz program\n";
    cout << "*********************************************** *\n";
}

//-------------------------------------------------------------------------
void Do_Listy( std::string W )
/* Procedura dolacza nowy element do listy - na koniec listy */
{
    ELEMENT * Nowy;
    Nowy = new ELEMENT;
    if( Lista->Glowa == NULL ) // do^?czenie nowego elementu
    { // do listy pustej
        Lista->Glowa = Nowy;
        Lista->Ogon = Lista->Glowa;
    }
    else // do^?czenie nowego elementu
    { Lista->Ogon->Nastepny = Nowy; // na koäcu listy niepustej
        Lista->Ogon = Nowy;
    }
    Nowy->Wartosc = W;
    Nowy->Nastepny = NULL;
}

//---------------------------------------------------------------------
void Dopisz_K_elem_do_Listy()
/* Procedura dopisuje K elementow na koniec listy */
{
    int i, K;
    std::string W;
   
    clrscr();
    cout << "Ile elementow dopisujemy do listy (podaj K<6): ";
    cin >> K;
    cout << "Wprowadz kolejne elementy listy:\n";
    for( i = 1; i <= K; i++ )
    {
        cout << "element_";
        cout.width( 2 );
        cout << i << " = ";
        cin >> W;
        Do_Listy( W );
    }
    cout << "Elementy dopisano do listy - nacisnij klawisz\n";
    getch();
}

//------------------------------------------------------------------------
void Pisz_Liste()
/* Procedura wyswietla elementy listy w kierunku od poczatku do konca */
{
    ELEMENT * Biezacy;
    int i = 0;
   
    clrscr();
    Biezacy = Lista->Glowa;
    if( Lista->Glowa == NULL )
         cout << "Lista jest pusta\n";
    else while( Biezacy != NULL )
    {
        i++;
        cout.width( 2 );
        cout << "element_" << i << " : " << Biezacy->Wartosc << endl;
        Biezacy = Biezacy->Nastepny;
    }
    cout << "Wypisano elementy z listy - nacisnij klawisz\n";
    getch();
}

//-------------------------------------------------------------------------
void Usun_Liste()
{
    int i = 0;
    ELEMENT * Usuniety;
   
    if( Lista->Glowa == NULL )
         cout << "Lista jest pusta - nacisnij klawisz";
    else { while( Lista->Glowa != NULL )
        {
            i++;
            Usuniety = Lista->Glowa;
            Lista->Glowa = Lista->Glowa->Nastepny;
            delete Usuniety;
        }
        if( Lista->Glowa == NULL )
        cout << "\nListe usunieto ( " <<
             i << " element. ) - nacisnij klawisz" << endl;
       
    }
    getch();
}
P-11026
dmx81
Temat założony przez niniejszego użytkownika
» 2009-10-21 22:49:33
C/C++
#include <iostream>
#include <conio.h>

struct loty
{
    std::string nazwisko;
    loty * nastepny;
};

int main()
{
    loty * Rzym = new loty;
    int r;
    std::cout << "podaj r\n";
    std::cin >> r;
   
    loty * gora = NULL;
    loty * dol;
    if( gora == NULL )
    {
        gora = Rzym;
        dol = gora;
       
    }
    else
    {
       
        dol->nastepny = Rzym;
        dol = dol->nastepny;
    }
    Rzym->nastepny = NULL;
   
   
    for( int i = 0; i < r; i++ )
    {
        std::cout << "\npodaj nazwiska\n";
        std::cin >> Rzym->nazwisko;
    }
   
    loty * element;
    element = gora;
    std::cout << "nazwiska\n" << gora->nazwisko;
    getch();
}

program pamieta tylko ostatni zapis, czyli cos nie tak, ale nie potrafie znalezc bledu, ciagle bede szukal, ale moze ktos w miedzy czasie pomoze?
P-11046
DejaVu
» 2009-10-22 02:37:17
Zmieniaj roota tylko i wyłącznie gdy == NULL.
P-11048
dmx81
Temat założony przez niniejszego użytkownika
» 2009-10-22 22:35:59
kurcze, sorki za wyrażenie ;) wszystko dobrze zadeklarowane...ale, a moze ALE... jedna linijka nie w tym miejscu co trzeba, ale znalazlem nareszcie,

byc moze o to chodzilo p.Piotrowi - bo nie do konca zrozumialem podpowiedz, ale trzeba bylo przeniesc loty*Rzym=new loty do petli, a nie jak ja zrobilem, poprostu zadeklarowac przy innych zmiennych, zaraz pod main();

przynajmniej juz rozumiem, o co chodzi w tworzeniu list, jak operowac wskaznikami, aby bylo dobrze, jeszcze kilka list dla praktyki i chyba bedzie opanowane:)

dzieki za cierpliwosc, nie raz bede jeszcze pytal
P-11062
dmx81
Temat założony przez niniejszego użytkownika
» 2009-10-23 18:01:48
C/C++
#include <iostream>
#include <conio.h>

struct loty
{
    std::string nazwisko;
    loty * nastepny;
};

main()
{
    int L, znak, licznik = 0;
    using namespace std;
   
   
    loty * gora = NULL;
    loty * dol;
    loty * Rzym;
    do
    {
        clrscr();
        cout << "MENU WYBORU\n\n_ _ _ _ _ _\n\n\n1 = dopisz nazwiska do listy\n\n2 = zobacz liste\n\n3 = wyjscie\n\n\n _ _ _ _ _ _\n\n";
        cin >> znak;
        clrscr();
        switch( znak )
        {
        case 1:
            cout << "\nile nazwisk zapisac?  = ";
            cin >> L;
            licznik += L;
            for( int i = 0; i < L; i++ )
            {
                Rzym = new loty;
               
                cout << "\npodaj nazwisko nr " << i + 1 << "\n";
                cin >> Rzym->nazwisko;
               
                if( gora == NULL )
                {
                    gora = Rzym;
                    dol = gora;
                }
                else
                {
                    dol->nastepny = Rzym;
                    dol = Rzym;
                }
                Rzym->nastepny = NULL;
            }
            cout << "\n dopisano " << L << " nowe nazwisk(a) do listy \n";
            cout << "\n w sumie dopisano juz " << licznik << " nazwik(a) do listy\n";
            getch();
            break;
           
        case 2:
           
            cout << "\nLISTA NAZWISK\n  ";
            if( gora == NULL )
            {
                cout << "\nlista pusta... wcisnij dowolny klawisz\n";
                getch();
            }
            else
            { int i = 1;
                loty * wyswietl = gora;
                while( wyswietl != NULL )
                {
                    cout << "\n" << i << ". " << wyswietl->nazwisko << endl;
                    wyswietl = wyswietl->nastepny;
                    i++;
                }
               
                getch();
            }
            getch();
           
            break;
        case 3:
            cout << "koniec";
            getch();
            break;
            default:
            cout << "\nzla liczba\n";
            getch();
            break;
        }
    }
    while( znak != 3 );
   
}

programik smiga, a to tylko wstep do tego, co planuje zrobic...

mam pytanie, czy powinienem uzyc w tym kodzie "delete" ?
drugie pytanie, kiedy uzywac delete w kodzie, czy na wyjsciu z programu, czy podczas dzialania - bo w sumie skoro pisze liste, to potrzebne mi te dane aby byly zapamietane caly czas trwania programu, a widzialem niektore przyklady, gdzie usuwanie przez delete nastepuje podczas trwania programu - czyli ze usuwane dane sa zbedne do dalszej pracy programu?
P-11072
DejaVu
» 2009-10-23 20:06:24
Używasz delete wtedy gdy dane usuwasz i nie będziesz już z nich korzystał.
P-11074
dmx81
Temat założony przez niniejszego użytkownika
» 2009-10-24 20:04:53
Witam ponownie. Czy jest mozliwe, aby prowadzic 3 listy w programie? przyklad:

menu da wybor lotu do 1 z 3 miast, zaleznie od wyboru, nazwisko bedzie zapisywane na lot w odpowiednie miejsce, a liczba biletow na dany lot bedzie ubywala

oczywiscie co do biletow nie ma problemu - petla switch i dla kazdego miasta osobny case, a tam ubywa np biletyRZYM-=zamowienie, biletyMIASTO2-=zamowienie itd...

chodzi o to, ze mam strukture ze zmiennymi 'nazwisko' i 'nastepny'
czy powinienem w tym celu stworzyc nowe struktury, dla kazdego miasta osobna?
tak, abym mogl pozniej wyswietlic osobno bilety sprzedane na jedno miasto

oczywiscie w miedzy czasie sam tez probuje - ale byc moze sa rozwiazania, o ktorych jeszcze nie wiem (tak jak wczesniej z dynamicznym przydzielaniem pamieci, pozniej z listami)

C/C++
#include <iostream>
#include <conio.h>
using namespace std;
struct loty
{
    std::string nazwisko;
    loty * nastepny;
};
loty * Rzym;
loty * Paryz;
loty * Tokio;
loty * gora = NULL;
loty * dol;
int i = 1;
void kolejka( loty * wskaznik );

main()
{
    int L, znak, licznik = 0;
   
    do
    {
       
        cout << "\n1 = Rzym\n2 = Paryz\n3 = Tokio\n4 = wyjscie\n";
        cin >> znak;
       
        switch( znak )
        {
        case 1:
           
            do
            {
                clrscr();
                cout << "MENU WYBORU\n\n_ _ _ _ _ _\n\n\n1 = dopisz nazwiska do listy\n\n2 = zobacz liste\n\n3 = wyjscie\n\n\n _ _ _ _ _ _\n\n";
                cin >> znak;
                clrscr();
                switch( znak )
                {
                case 1:
                    cout << "\nile nazwisk zapisac?  = ";
                    cin >> L;
                    licznik += L;
                    for( i = 1; i <= L; i++ )
                    {
                        kolejka( Rzym );
                    }
                    cout << "\n dopisano " << L << " nowe nazwisk(a) do listy \n";
                    cout << "\n w sumie dopisano juz " << licznik << " nazwik(a) do listy\n";
                    getch();
                    break;
                   
                case 2:
                   
                    cout << "\nLISTA NAZWISK\n  ";
                    if( gora == NULL )
                    {
                        cout << "\nlista pusta... wcisnij dowolny klawisz\n";
                        getch();
                    }
                    else
                    { int i = 1;
                        loty * wyswietl = gora;
                        while( wyswietl != NULL )
                        {
                            cout << "\n" << i << ". " << wyswietl->nazwisko << endl;
                            wyswietl = wyswietl->nastepny;
                            i++;
                        }
                       
                        getch();
                    }
                    getch();
                   
                    break;
                case 3:
                    cout << "koniec";
                    getch();
                    break;
                    default:
                    cout << "\nzla liczba\n";
                    getch();
                    break;
                }
            }
            while( znak != 3 );
           
            break;
        case 2:
            do
            {
                clrscr();
                cout << "MENU WYBORU\n\n_ _ _ _ _ _\n\n\n1 = dopisz nazwiska do listy\n\n2 = zobacz liste\n\n3 = wyjscie\n\n\n _ _ _ _ _ _\n\n";
                cin >> znak;
                clrscr();
                switch( znak )
                {
                case 1:
                    cout << "\nile nazwisk zapisac?  = ";
                    cin >> L;
                    licznik += L;
                    for( i = 1; i <= L; i++ )
                    {
                        kolejka( Paryz );
                    }
                    cout << "\n dopisano " << L << " nowe nazwisk(a) do listy \n";
                    cout << "\n w sumie dopisano juz " << licznik << " nazwik(a) do listy\n";
                    getch();
                    break;
                   
                case 2:
                   
                    cout << "\nLISTA NAZWISK\n  ";
                    if( gora == NULL )
                    {
                        cout << "\nlista pusta... wcisnij dowolny klawisz\n";
                        getch();
                    }
                    else
                    { int i = 1;
                        loty * wyswietl = gora;
                        while( wyswietl != NULL )
                        {
                            cout << "\n" << i << ". " << wyswietl->nazwisko << endl;
                            wyswietl = wyswietl->nastepny;
                            i++;
                        }
                       
                        getch();
                    }
                    getch();
                   
                    break;
                case 3:
                    cout << "koniec";
                    getch();
                    break;
                    default:
                    cout << "\nzla liczba\n";
                    getch();
                    break;
                }
            }
            while( znak != 3 );;
            break;
        case 3:
            do
            {
                clrscr();
                cout << "MENU WYBORU\n\n_ _ _ _ _ _\n\n\n1 = dopisz nazwiska do listy\n\n2 = zobacz liste\n\n3 = wyjscie\n\n\n _ _ _ _ _ _\n\n";
                cin >> znak;
                clrscr();
                switch( znak )
                {
                case 1:
                    cout << "\nile nazwisk zapisac?  = ";
                    cin >> L;
                    licznik += L;
                    for( i = 1; i <= L; i++ )
                    {
                        kolejka( Tokio );
                    }
                    cout << "\n dopisano " << L << " nowe nazwisk(a) do listy \n";
                    cout << "\n w sumie dopisano juz " << licznik << " nazwik(a) do listy\n";
                    getch();
                    break;
                   
                case 2:
                   
                    cout << "\nLISTA NAZWISK\n  ";
                    if( gora == NULL )
                    {
                        cout << "\nlista pusta... wcisnij dowolny klawisz\n";
                        getch();
                    }
                    else
                    { int i = 1;
                        loty * wyswietl = gora;
                        while( wyswietl != NULL )
                        {
                            cout << "\n" << i << ". " << wyswietl->nazwisko << endl;
                            wyswietl = wyswietl->nastepny;
                            i++;
                        }
                       
                        getch();
                    }
                    getch();
                   
                    break;
                case 3:
                    cout << "koniec";
                    getch();
                    break;
                    default:
                    cout << "\nzla liczba\n";
                    getch();
                    break;
                }
            }
            while( znak != 3 );
           
            break;
        case 4:
            break;
        default:
            cout << "\nzla liczba\n";
            break;
        }
       
       
    }
    while( znak != 4 );
   
}
void kolejka( loty * wskaznik )
{
   
    wskaznik = new loty;
   
    cout << "\npodaj nazwisko nr " << i << "\n";
    cin >> wskaznik->nazwisko;
   
    if( gora == NULL )
    {
        gora = wskaznik;
        dol = gora;
    }
    else
    {
        dol->nastepny = wskaznik;
        dol = wskaznik;
    }
    wskaznik->nastepny = NULL;
   
   
}

w tym kodzie, poki co, zapisane nazwiska dla jednego miasta, widoczne sa rowniez dla innych, chce to wlasnie zmienic, aby kazde miasto prowadzilo wlasna ewidencje nazwisk
P-11075
DejaVu
» 2009-10-24 20:45:14
C/C++
struct pasazer
{
    std::string imie;
    std::string nazwisko;
    pasazer * nastepny;
};

struct lot
{
    std::string skad;
    std::string dokad;
    int pozostalo_biletow;
    pasazer * lista;
    lot * nastepny;
};

//...
lot * lista = NULL;
P-11076
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona