Pomocy! lista pisana wspak
Ostatnio zmodyfikowano 2011-04-01 22:02
waldiw Temat założony przez niniejszego użytkownika |
Pomocy! lista pisana wspak » 2011-03-31 14:34:14 Proszę o pomoc w rozwiązaniu problemu z pisaniem listy jednokierunkowej wspak - punkt c. Wszystkie polecenia rozwiązałem, a do tego nie wim jak się zabrać. Ma ktoś może pomysł, jak to zrobić?
#include <iostream.h> #include <conio.h>
typedef struct El { int Wartosc; struct El * Nastepny; } ELEMENT; typedef struct { ELEMENT * Glowa; ELEMENT * Ogon; } INFO;
void Pisz_Menu(); void Do_Listy( INFO * Lista, int W ); void Dopisz_K_elem_do_Listy( INFO * Lista ); void Pisz_Liste( INFO * Lista ); void Usun_Liste( INFO * Lista ); void Pisz_Parzyste( INFO * Lista ); void Usun_K_z_Listy( INFO * Lista ); void Pisz_Wspak( int j, struct El * Biezacy );
main() { char znak; INFO * Lista; Lista = new INFO; Lista->Glowa = NULL; Lista->Ogon = NULL; do { system( "cls" ); Pisz_Menu(); znak = getch(); switch( znak ) { case '1': Dopisz_K_elem_do_Listy( Lista ); break; case '2': Pisz_Liste( Lista ); break; case '3': Usun_Liste( Lista ); break; case '4': Pisz_Parzyste( Lista ); break; case '5': Usun_K_z_Listy( Lista ); break; } } while( znak != '0' ); Usun_Liste( Lista ); }
void Pisz_Menu() { cout << "\n************************************************\n"; 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 o wartosciach parzystych\n"; cout << "5. Usun K elementow z listy\n"; cout << "6. Pokaz liste wspak- do zrobienia\n"; cout << "0. Zakoncz program\n"; cout << "************************************************\n"; }
void Do_Listy( INFO * Lista, int W )
{ ELEMENT * Nowy; Nowy = new ELEMENT; if( Lista->Glowa == NULL ) { Lista->Glowa = Nowy; Lista->Ogon = Lista->Glowa; } else { Lista->Ogon->Nastepny = Nowy; Lista->Ogon = Nowy; } Nowy->Wartosc = W; Nowy->Nastepny = NULL; }
void Dopisz_K_elem_do_Listy( INFO * Lista )
{ int i, K, W; 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( Lista, W ); } cout << "Elementy dopisano do listy - nacisnij klawisz\n"; getch(); }
void Pisz_Liste( INFO * Lista )
{ ELEMENT * Biezacy; int i = 0; Biezacy = Lista->Glowa; if( Lista->Glowa == NULL ) cout << "Lista jest pusta\n"; else while( Biezacy != NULL ) { i++; cout << "element_" << i << " : "; cout.width( 10 ); cout << Biezacy->Wartosc << endl; Biezacy = Biezacy->Nastepny; } cout << "Wypisano elementy z listy - nacisnij klawisz\n"; getch(); }
void Usun_Liste( INFO * Lista )
{ 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(); }
void Pisz_Wspak( int j, struct El * Biezacy )
{ }
void Usun_K_z_Listy( INFO * Lista )
{ int i = 0; ELEMENT * Usuniety; int k; cout << "Ile elementow usunac ? "; cin >> k; for( int j = 0; j < k; j++ ) { i++; Usuniety = Lista->Glowa; Lista->Glowa = Lista->Glowa->Nastepny; delete Usuniety; if( Lista->Glowa == NULL ) break; } cout << "\nZ listy usunieto ( " << i << " element. ) - nacisnij klawisz" << endl; getch(); }
void Pisz_Parzyste( INFO * Lista )
{ ELEMENT * Biezacy; int i = 0; Biezacy = Lista->Glowa; if( Lista->Glowa == NULL ) cout << "Lista jest pusta\n"; else while( Biezacy != NULL ) { i++; if( Biezacy->Wartosc % 2 == 0 ) cout << "element_" << i << " : " << Biezacy->Wartosc << endl; Biezacy = Biezacy->Nastepny; } cout << "Wypisano parzyste elementy z listy - nacisnij klawisz\n"; getch(); }
|
|
pekfos |
» 2011-03-31 14:56:53 he? to chyba banalne. tworzysz nowy obiekt, jego adres do wskażnika na początek a do wskażnika w obiekcie poprzedni adres początku. tyle komentarzy że aż nieczytelne. wstaw kod w [cpp] [/cpp] nie powinno się używać iostream.h. jak nagłówki pisał nauczyciel to lepiej zostań ninja :P w następnych standardach te nagłówki mogą nie być uznawane i cała twoja wiedza o bibliotece standardowej na nic się nie zda jak nie będziesz znał nazw właściwych nagłówków. |
|
DejaVu |
» 2011-03-31 16:03:44 On ma to rekurencyjnie rozwiązać. Anyway - wchodzisz rekurencją najpierw maksymalnie w głąb (każda do swojego następnika), a potem wypisujesz element na ekran i to wszystko. 3 linijki kodu wewnątrz funkcji. |
|
waldiw Temat założony przez niniejszego użytkownika |
» 2011-03-31 17:22:22 A można ładnie poprosić o te trzy linijki kodu? Pomoże mi to zrozumieć dokłądnie problem. |
|
DejaVu |
» 2011-03-31 17:55:22 Nie można :) Rozwiązanie jest proste. Poczytaj o rekurencji. Jak będziesz wiedział co to jest rekurencja to i będziesz wiedział jak to zadanie zrobić (jeżeli całą resztę wykonałeś samodzielnie). |
|
waldiw Temat założony przez niniejszego użytkownika |
» 2011-03-31 20:00:57 Szkoda, że nie można:(. Całą resztę zrobiłem sam. Z grubsza oriętuję się, co to jest rekurencja. Rozwiązuję zadania z c++ z pierwszego roku politechniki w ramach rozrywki intelektualnej, a że jestem uparty i nie znalazłem odpowiedzi w necie, to zadałem pytanie tutaj. |
|
DejaVu |
» 2011-03-31 20:02:12 :) to napisz rekurencyjnie przechodzenie listy a potem pomyśl w którym miejscu dopisać jedną linijkę wypisującą wartość liścia. |
|
waldiw Temat założony przez niniejszego użytkownika |
» 2011-03-31 20:50:39 Napisałem taką funkcję rekurncyjną:
void Pisz_Wspak( int j, struct El * Biezacy )
{ if( Biezacy != NULL ) { cout << "element_" << j << " : " << Biezacy->Wartosc << endl; Pisz_Wspak( j + 1, Biezacy->Nastepny ); } }
ale wyświetla ona element po kolei. Jak zrobić, żeby było wspak? |
|
« 1 » 2 |