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

Lista dwukierunkowa - błąd w działaniu programu

Ostatnio zmodyfikowano 2015-03-29 17:42
Autor Wiadomość
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:
C/C++
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
C/C++
#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;
P-129419
pekfos
» 2015-03-29 15:07:32
C/C++
pierwszy = nowy;
pierwszy->nastepny = nowy;
pierwszy->poprzedni = nowy;
Jaki to ma sens?
P-129420
cryuff
Temat założony przez niniejszego użytkownika
» 2015-03-29 15:12:34
Zmieniłem konstruktor oraz dodaj_pocz
C/C++
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
P-129421
pekfos
» 2015-03-29 15:16:39
C/C++
element * nowy = new element;
nowy->wartosc = w;
pierwszy = nowy;
ostatni = nowy;
wybrany = nowy;
Co z adresami w nowy..?
P-129423
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.
C/C++
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;
}
P-129441
pekfos
» 2015-03-29 16:34:28
Jaki kod? jaki błąd?
P-129443
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:
C/C++
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:
C/C++
{
    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:
C/C++
string lista::wyswietlodkon()
{
    string temp = "Lista od konca:";
    wsknakon();
    for( int i = 0; i < rozmiar; i++ )
    {
        temp += to_string( wskazany->wartosc ) + ";";
        poprzedni();
    }
    return temp;
}

C/C++
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:
C/C++
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:
C/C++
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:
C/C++
temp += to_string( wskazany->wartosc ) + ";";
tylko w linii:
C/C++
( nowy->poprzedni )->nastepny = ostatni;
P-129446
pekfos
» 2015-03-29 16:53:39
Nie możesz po prostu napisać ostatni->nastepny = nowy, zanim zmienisz ostatni na nowy?
P-129447
« 1 » 2 3
  Strona 1 z 3 Następna strona