Lista dwukierunkowa - błąd w działaniu programu
Ostatnio zmodyfikowano 2015-03-29 17:42
cryuff Temat założony przez niniejszego użytkownika |
Lista dwukierunkowa - błąd w działaniu programu » 2015-03-29 15:04:55 Chciałbym aby ktoś przejrzał kod i powiedział mi co jest nie tak. Pierwszy plik lista.h: class lista { private: struct element { element * poprzedni; element * nastepny; int wartosc; }; element * ostatni; element * pierwszy; element * wybrany; int rozmiar; public: lista(); lista( int roz ); void dodaj_pocz( int liczba ); void dodaj_kon( int liczba ); void lista::na_poczatek(); void lista::na_koniec(); void lista::nast(); void lista::wyswietl(); void lista::nastepny(); void lista::poprzedni(); };
Plik lista.cpp #include "lista.h" #include "biblioteczka.h"
lista::lista() { pierwszy = ostatni = NULL; rozmiar = 0; } lista::lista( int r ) { int l, x, y, z, a, b; for( int i = 0; i < r; i++ ) { l = rand() % 2000000000; x = rand() % 2; y = rand() % 2; z = rand() % 2; if( y == 1 ) { a = rand() % 256; l = l * a; } if( z == 1 ) { b = rand() % 256; l = l * b; } if( x == 1 ) l = l *( - 1 ); while( true ) { if( l > 2000000000 ) { l = rand() % 2000000000; x = rand() % 2; if( y == 1 ) { a = rand() % 256; l = l * a; } if( z == 1 ) { b = rand() % 256; l = l * a; } if( x == 1 ) l = l *( - 1 ); } else break; } dodaj_pocz( l ); } }
void lista::na_poczatek() { wybrany = pierwszy; } void lista::na_koniec() { wybrany = ostatni; } void lista::dodaj_pocz( int w ) { if( rozmiar == 0 ) { element * nowy = new element; nowy->wartosc = w; pierwszy = nowy; pierwszy->nastepny = nowy; pierwszy->poprzedni = nowy; ostatni = nowy; ostatni->nastepny = nowy; ostatni->poprzedni = nowy; wybrany = nowy; rozmiar++; return; } else { element * nowy = new element; nowy->poprzedni = NULL; nowy->wartosc = w; nowy->nastepny = pierwszy; pierwszy->poprzedni = nowy; pierwszy = nowy; rozmiar++; } } void lista::dodaj_kon( int w ) { if( rozmiar == 0 ) { element * nowy = new element; nowy->wartosc = w; pierwszy = nowy; ostatni = nowy; wybrany = nowy; rozmiar++; return; } element * nowy = new element; nowy->wartosc = w; nowy->poprzedni = ostatni; ostatni = nowy; ostatni->nastepny = nowy; rozmiar++; } void lista::nastepny() { if( wybrany == ostatni ) wybrany = NULL; else wybrany = wybrany->nastepny; } void lista::poprzedni() { if( wybrany == pierwszy ) wybrany = NULL; else wybrany = wybrany->poprzedni; } void lista::wyswietl() { na_poczatek(); cout << "Od poczatku:\n"; for( int i = 0; i < rozmiar; i++ ) { cout << wybrany->wartosc; if( wybrany != ostatni ) cout << "->"; else cout << endl; nastepny(); } cout << "Od konca:\n"; na_koniec(); for( int i = 0; i < rozmiar; i++ ) { cout << wybrany->wartosc; if( wybrany != pierwszy ) cout << "->"; else cout << endl; poprzedni(); } } Program wysypuje się przy wykonywaniu przy tworzeniu nowej losowej listy w dodaj_pocz w linii: pierwszy->poprzedni = nowy; |
|
pekfos |
» 2015-03-29 15:07:32 pierwszy = nowy; pierwszy->nastepny = nowy; pierwszy->poprzedni = nowy;
|
Jaki to ma sens? |
|
cryuff Temat założony przez niniejszego użytkownika |
» 2015-03-29 15:12:34 Zmieniłem konstruktor oraz dodaj_pocz void lista::dodaj_pocz( int w ) { if( rozmiar == 0 ) { element * nowy = new element; nowy->wartosc = w; pierwszy = nowy; ostatni = nowy; wybrany = nowy; rozmiar++; return; } else { element * nowy = new element; nowy->poprzedni = NULL; nowy->wartosc = w; nowy->nastepny = pierwszy; pierwszy = nowy; rozmiar++; } }
lista::lista( int r ) { int j; for( int i = 0; i < r; i++ ) { j = rand(); dodaj_pocz( j ); } }
Teraz jednak wyświetla tylko napisy czyli nie dodaje nic do listy |
|
pekfos |
» 2015-03-29 15:16:39 element * nowy = new element; nowy->wartosc = w; pierwszy = nowy; ostatni = nowy; wybrany = nowy;
|
Co z adresami w nowy..? |
|
cryuff Temat założony przez niniejszego użytkownika |
» 2015-03-29 16:26:16 Teraz sytuacja wygląda tak, że wyświetla listę od końca, nie chce jej wyświetlić od początku czyli jest coś nie tak z elementami następny. Wydaje mi się, że w metodzie dodajkon powinien znaleźć się wiersz: ostatni->nastepny=nowy; tylko podczas dodawania go wyrzuca mi błąd. lista::lista( int roz ) { int j; for( int i = 0; i < roz; i++ ) { j = rand(); dodajkon( j ); } rozmiar = roz; } void lista::wsknapocz() { wskazany = pierwszy; } void lista::wsknakon() { wskazany = ostatni; } void lista::dodajpocz( int war ) { if( rozmiar == 0 ) { element * nowy = new element; nowy->wartosc = war; nowy->poprzedni = NULL; nowy->nastepny = NULL; pierwszy = nowy; ostatni = nowy; rozmiar++; } else { element * nowy = new element; nowy->wartosc = war; nowy->nastepny = pierwszy; nowy->poprzedni = NULL; pierwszy = nowy; rozmiar++; } } void lista::dodajkon( int war ) { if( rozmiar == 0 ) { element * nowy = new element; nowy->wartosc = war; nowy->poprzedni = NULL; nowy->nastepny = NULL; pierwszy = nowy; ostatni = nowy; wskazany = nowy; rozmiar++; } else { element * nowy = new element; element * temp = new element; nowy->wartosc = war; nowy->poprzedni = ostatni; nowy->nastepny = NULL; ostatni = nowy; rozmiar++; } } void lista::nastepny() { if( wskazany == ostatni ) wskazany = NULL; else wskazany = wskazany->nastepny; } void lista::poprzedni() { if( wskazany == pierwszy ) wskazany = NULL; else wskazany = wskazany->poprzedni; } string lista::wyswietlodpocz() { string temp = "Lista od poczatku:"; wsknapocz(); for( int i = 0; i < rozmiar; i++ ) { temp += to_string( wskazany->wartosc ) + ";"; nastepny(); } return temp; } string lista::wyswietlodkon() { string temp = "Lista od konca:"; wsknakon(); for( int i = 0; i < rozmiar; i++ ) { temp += to_string( wskazany->wartosc ) + ";"; poprzedni(); } return temp; }
|
|
pekfos |
» 2015-03-29 16:34:28 Jaki kod? jaki błąd? |
|
cryuff Temat założony przez niniejszego użytkownika |
» 2015-03-29 16:45:01 Robię to na takiej zasadzie: 1)W Mainie pobieram rozmiar 2)Przekazuję go tutaj: lista::lista( int roz ) { int j; for( int i = 0; i < roz; i++ ) { j = rand(); dodajkon( j ); } rozmiar = roz; }
3)Powinien dodawać losowe elementy do listy tutaj: { if( rozmiar == 0 ) { element * nowy = new element; nowy->wartosc = war; nowy->poprzedni = NULL; nowy->nastepny = ostatni; pierwszy = nowy; ostatni = nowy; wskazany = nowy; rozmiar++; } else { element * nowy = new element; element * temp = new element; nowy->wartosc = war; nowy->poprzedni = ostatni; ostatni = nowy; rozmiar++; } }
4)Oraz wyświetlać listę od początku lub od końca w zależności od użytej komendy: string lista::wyswietlodkon() { string temp = "Lista od konca:"; wsknakon(); for( int i = 0; i < rozmiar; i++ ) { temp += to_string( wskazany->wartosc ) + ";"; poprzedni(); } return temp; }
string lista::wyswietlodpocz() { string temp = "Lista od poczatku:"; wsknapocz(); for( int i = 0; i < rozmiar; i++ ) { temp += to_string( wskazany->wartosc ) + ";"; nastepny(); } return temp; }
Od końca wyświetla, od początku niestety nie. Wskazuje wtedy na problem w tej linii: temp += to_string( wskazany->wartosc ) + ";";
Wydaje mi się, że ma problem z wskaźnikami następny, są źle ustawione. Probowałem również przerobić metodę dodaj_kon dodając linie: else { element * nowy = new element; element * temp = new element; nowy->wartosc = war; nowy->poprzedni = ostatni; ostatni = nowy; !( nowy->poprzedni )->nastepny = ostatni; ! rozmiar++; }
Jednak wtedy otrzymuję błąd unhanled exception jednak nie w linii: temp += to_string( wskazany->wartosc ) + ";";
tylko w linii: ( nowy->poprzedni )->nastepny = ostatni;
|
|
pekfos |
» 2015-03-29 16:53:39 Nie możesz po prostu napisać ostatni->nastepny = nowy, zanim zmienisz ostatni na nowy? |
|
« 1 » 2 3 |