Linked List - sortowanie podczas dodawania
Ostatnio zmodyfikowano 2012-09-06 20:06
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 #include <iostream>
using namespace std;
struct osoba { int wiek; osoba * nast; };
void dodaj( osoba *& glowa, int wiek ) { osoba * nowy = new osoba;; nowy->nast = NULL; nowy->wiek = wiek; if( glowa == NULL ) { glowa = nowy; } else { osoba * ostatni = glowa; while(( ostatni != NULL ) ) { 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' ); }
|
|
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 :-) while(( ostatni != NULL ) ) { if(( nowy->wiek ) <=( ostatni->wiek ) ) { 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; } ostatni = ostatni->nast; }
|
|
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? |
|
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ś :-) void dodaj( osoba *& glowa, int wiek ) { osoba * nowy = new osoba; osoba * ostatni, * ostatni2; nowy->nast = NULL; nowy->wiek = wiek; if( glowa == NULL ) { glowa = nowy; } else { int ilosc = 0; ostatni = glowa; while(( ostatni != NULL ) ) { ilosc++; 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; } } }
|
|
« 1 » |