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

Linked List - sortowanie podczas dodawania

Ostatnio zmodyfikowano 2012-09-06 20:06
Autor Wiadomość
Caranti
Temat założony przez niniejszego użytkownika
Linked List - sortowanie podczas dodawania
» 2012-09-06 19:07:50
Chciałbym utworzyć linked liste z sortowaniem gdy dodaje nowy element.

Za pierwszy punkt obrałem sobie jeśli mamy jeden element w liście dla przykładu 
głowa = 2;    tmp = glowa;   // zmienna pomocnicza
nowy  = 1;
Mam zamiar zamienić    nowy " 1 " -> tmp " 2 "
I tu właśnie tkwi diabeł xD nie zamienia .
Myślę że gubię gdzieś wskaźnik bo gdy wywołuje funkcje wypisz wypisuje o dziwo tylko 2 :-)
Proszę jedynie o jakąś wskazówkię a początek :-)  
Później zobaczymy co wyjdzie w praniu

Poniżej zamieszczam funkcje  dodaj
C/C++
#include <iostream>

using namespace std;

struct osoba
{
    int wiek;
    osoba * nast;
};
//***************************************************
void dodaj( osoba *& glowa, int wiek )
{
    osoba * nowy = new osoba;;
    //NADANIE WARTOSCI SKLADNIKOWI OSOBA
    nowy->nast = NULL;
    nowy->wiek = wiek;
   
   
    if( glowa == NULL )
    {
        glowa = nowy;
    }
    else
    {
        osoba * ostatni = glowa;
        while(( ostatni != NULL ) )
        {
            //ZAMIANA AKTUALNEGO ELEMENTU Z NOWYM   np   2 -> 1     1 -> 2
            if(( nowy->wiek ) <=( ostatni->wiek ) )
            {
                osoba * tmp = ostatni;
                cout << "ostatni : " << ostatni->wiek << "   tmp : " << tmp->wiek << "\tnowy " << nowy->wiek << endl;
                ostatni = nowy;
                cout << "ostatni : " << ostatni->wiek << "   tmp : " << tmp->wiek << "\tnowy " << nowy->wiek << endl;
                ostatni->nast = tmp;
                break;
            }
            ostatni = ostatni->nast;
        }
    }
}
void wypisz( osoba * teraz )
{
    while( teraz != NULL )
    {
        cout << teraz->wiek << endl;
        teraz = teraz->nast;
    }
}
int main()
{
    char powtorz;
    int wybor, wiek;
    osoba * glowa = NULL;
    do
    {
        cout << "CO CHCESZ WYBRAC ? " << endl;
        cout << "1 - Dodaj element " << endl;
        cout << "2 - Przegladanie Listy " << endl;
        cout << "3 - usuwanie elementu " << endl;
        cin >> wybor; cout << "\n" << endl;
       
        switch( wybor )
        {
        case 1:
            cout << "Podaj wiek :" << endl;
            cin >> wiek;
            dodaj( glowa, wiek );
           
            break;
           
        case 2:
            wypisz( glowa );
            break;
           
        case 3:
           
            break;
           
        default:
            cout << "Wybrales zly numer ";
            break;
        }
        cout << "Czy chcesz powtorzyc ??  T-tak  N - nie ";
        cin >> powtorz;
        cout << "\n\n";
    }
    while( powtorz == 't' || powtorz == 'T' );
   
}


P-64453
Caranti
Temat założony przez niniejszego użytkownika
» 2012-09-06 19:18:22
A chciałbym jeszcze dodać że jeśli w funkcji dodaj zamienie
glowa = nowy;     
glowa->nast = tmp;

Wszystko jest ok funckja wypisz wypisuje ladnie 1  ->   2    :-)

C/C++
while(( ostatni != NULL ) )
{
    //ZAMIANA AKTUALNEGO ELEMENTU Z NOWYM   np   2 -> 1     1 -> 2
    if(( nowy->wiek ) <=( ostatni->wiek ) )
    {
        osoba * tmp = ostatni;
        cout << "ostatni : " << ostatni->wiek << "   tmp : " << tmp->wiek << "\tnowy " << nowy->wiek << endl;
        glowa = nowy; // TUTAJ !!!!!!!!!!!!!!!!!!!!!!!!!!
        cout << "ostatni : " << ostatni->wiek << "   tmp : " << tmp->wiek << "\tnowy " << nowy->wiek << endl;
        glowa->nast = tmp; // TUTAJ !!!!!!!!!!!!!!!!!!!!!!!!!
        break;
    }
    ostatni = ostatni->nast;
}

P-64454
DejaVu
» 2012-09-06 19:48:53
Do zamiany elementów wystarczy użyć szablonu std::swap. Jednak to nic Ci nie da, ponieważ dodając element do listy należy zmieniać wskaźniki prev oraz next na odpowiednie.

PS. Czemu nie użyjesz po prostu std::priority_queue ? bądź std::set? bądź std::map? bądź std::multiset? bądź std::multimap? bądź std::vector w połączeniu std::sort?
P-64460
Caranti
Temat założony przez niniejszego użytkownika
» 2012-09-06 20:06:19
Nie używam ponieważ jeszcze nie doszedłem do tak zajebistych zagadnień  ;)
Ale odziwo 30 min myślenia napisałem coś nowego tzn dopisałem i ku mojemu zdziwieniu działa
Popróbuje najwyzej wszystkie kombinacje.

A tak nawiasem to nie wiem czy takich cudeniek moge używać na kolosie co wczesniej wspomniałeś . Poprastu zaczołem coś rzeźbić coś :-)

C/C++
void dodaj( osoba *& glowa, int wiek )
{
    osoba * nowy = new osoba;
    osoba * ostatni, * ostatni2;
    //NADANIE WARTOSCI SKLADNIKOWI OSOBA
    nowy->nast = NULL;
    nowy->wiek = wiek;
   
   
    if( glowa == NULL )
    {
        glowa = nowy;
    }
    else
    { int ilosc = 0;
        ostatni = glowa;
        while(( ostatni != NULL ) )
        {
            ilosc++;
            //ZAMIANA AKTUALNEGO ELEMENTU Z NOWYM   np   2 -> 1     1 -> 2
            if(( nowy->wiek ) <=( ostatni->wiek ) && ilosc <= 1 )
            {
                osoba * tmp = ostatni;
                cout << "ostatni : " << ostatni->wiek << "   tmp : " << tmp->wiek << "\tnowy " << nowy->wiek << endl;
                glowa = nowy;
                cout << "ostatni : " << ostatni->wiek << "   tmp : " << tmp->wiek << "\tnowy " << nowy->wiek << endl;
                glowa->nast = tmp;
                break;
            }
            if(( nowy->wiek ) <=( ostatni->wiek ) && ilosc > 1 )
            {
                osoba * tmp2 = ostatni;
                ostatni2->nast = nowy;
                nowy->nast = tmp2;
                break;
            }
            if(( nowy->wiek ) >=( ostatni->wiek ) && ostatni->nast == NULL )
            {
                ostatni->nast = nowy;
                break;
            }
            ostatni2 = ostatni;
           
            ostatni = ostatni->nast;
        }
    }
}

P-64461
« 1 »
  Strona 1 z 1