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
» 2015-03-29 16:55:10
Dostaje też unhandled exception i program przerywa działanie.
P-129448
pekfos
» 2015-03-29 17:08:10
Podaj kompletny aktualny kod.
P-129449
cryuff
Temat założony przez niniejszego użytkownika
» 2015-03-29 17:12:03
lista.cpp
C/C++
#include "lista.h"
#include "biblioteczka.h"

lista::lista()
{
    pierwszy = ostatni = NULL;
    rozmiar = 0;
}
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;
        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;
}
lista.h
C/C++
#include "biblioteczka.h"
#pragma once
class lista
{
   
private:
    struct element
    {
        element * poprzedni;
        element * nastepny;
        int wartosc;
    };
   
    element * ostatni;
    element * pierwszy;
    element * wskazany;
    int rozmiar;
   
public:
    lista();
    lista( int roz );
    void dodajpocz( int liczba );
    void dodajkon( int liczba );
    void wsknapocz();
    string wyswietlodpocz();
    string wyswietlodkon();
    void wsknakon();
    void nastepny();
    void poprzedni();
};
main
C/C++
#include "tablica.h"
#include "lista.h"
#include "biblioteczka.h"
#include "windows.h"
#include "basetsd.h"

LARGE_INTEGER startTimer()
{
    LARGE_INTEGER start;
    DWORD_PTR oldmask = SetThreadAffinityMask( GetCurrentThread(), 0 );
    QueryPerformanceCounter( & start );
    SetThreadAffinityMask( GetCurrentThread(), oldmask );
    return start;
}
LARGE_INTEGER endTimer()
{
    LARGE_INTEGER stop;
    DWORD_PTR oldmask = SetThreadAffinityMask( GetCurrentThread(), 0 );
    QueryPerformanceCounter( & stop );
    SetThreadAffinityMask( GetCurrentThread(), oldmask );
    return stop;
}
void menuTablicy()
{
    boolean zpliku = false;
    int opcja = 3;
    int rozmiar;
    string sciezka;
    int menu = 10;
    cout << "Utworz tablice: \n 1-Losowo \n 2-Z pliku \n";
    cin >> opcja;
    while( opcja != 0 )
    {
        if( opcja == 1 )
        {
            cout << "\n Rozmiar tablicy: \n";
            cin >> rozmiar;
            break;
        }
        if( opcja == 2 )
        {
            zpliku = true;
            string linia;
            fstream uchwyt;
            cout << "\n Sciezka do pliku: \n";
            cin >> sciezka;
            uchwyt.open( sciezka );
            getline( uchwyt, linia );
            uchwyt.close();
            rozmiar = atoi( linia.c_str() );
            break;
        }
    }
    Tablica tablica( rozmiar );
    if( zpliku == true )
    {
        tablica.tablicapl( rozmiar, sciezka );
    }
    while( menu != 0 )
    {
        cout << "\n 1-Usun \n 2-Usun poczatkowy \n 3-Usun koncowy \n 4-Dodaj \n 5-Dodaj poczatkowy \n 6-Dodaj koncowy"
        << "\n 7-Znajdz element \n 8-Wyswietl \n 9-Do MENU \n";
        cin >> menu;
        if( menu == 9 )
        {
            menu = 0;
        }
        if( menu == 1 )
        {
            int index;
            cout << "Podaj index elementu do usuniecia: \n";
            cin >> index;
            LARGE_INTEGER performanceCountStart, performanceCountEnd;
            performanceCountStart = startTimer();
            tablica.usun( index );
            cout << "Usunieto liczbe \n";
            performanceCountEnd = endTimer(); //zapamiętujemy koniec czasu
            double tm = performanceCountEnd.QuadPart - performanceCountStart.QuadPart;
            cout << endl << "Time:" << tm << endl;
        }
        if( menu == 2 )
        {
            LARGE_INTEGER performanceCountStart, performanceCountEnd;
            performanceCountStart = startTimer();
            tablica.usunpocz();
            cout << "Usunieto\n";
            performanceCountEnd = endTimer(); //zapamiętujemy koniec czasu
            double tm = performanceCountEnd.QuadPart - performanceCountStart.QuadPart;
            cout << endl << "Time:" << tm << endl;
        }
        if( menu == 3 )
        {
            LARGE_INTEGER performanceCountStart, performanceCountEnd;
            performanceCountStart = startTimer();
            tablica.usunkon();
            cout << "Usunieto\n";
            performanceCountEnd = endTimer(); //zapamiętujemy koniec czasu
            double tm = performanceCountEnd.QuadPart - performanceCountStart.QuadPart;
            cout << endl << "Time:" << tm << endl;
        }
        if( menu == 4 )
        {
            int index, liczba;
            cout << "Podaj index nowego elementu \n";
            cin >> index;
            cout << "Podaj wartosc nowego elementu \n";
            cin >> liczba;
            LARGE_INTEGER performanceCountStart, performanceCountEnd;
            performanceCountStart = startTimer();
            tablica.dodaj( index, liczba );
            performanceCountEnd = endTimer(); //zapamiętujemy koniec czasu
            double tm = performanceCountEnd.QuadPart - performanceCountStart.QuadPart;
            cout << endl << "Time:" << tm << endl;
        }
        if( menu == 5 )
        {
            int liczba;
            cout << "Podaj wartosc nowego elementu \n";
            cin >> liczba;
            LARGE_INTEGER performanceCountStart, performanceCountEnd;
            performanceCountStart = startTimer();
            tablica.dodajpocz( liczba );
            performanceCountEnd = endTimer(); //zapamiętujemy koniec czasu
            double tm = performanceCountEnd.QuadPart - performanceCountStart.QuadPart;
            cout << endl << "Time:" << tm << endl;
        }
        if( menu == 6 )
        {
            int liczba;
            cout << "Podaj wartosc nowego elementu \n";
            cin >> liczba;
            LARGE_INTEGER performanceCountStart, performanceCountEnd;
            performanceCountStart = startTimer();
            tablica.dodajkon( liczba );
            performanceCountEnd = endTimer(); //zapamiętujemy koniec czasu
            double tm = performanceCountEnd.QuadPart - performanceCountStart.QuadPart;
            cout << endl << "Time:" << tm << endl;
        }
        if( menu == 7 )
        {
            int liczba;
            cout << "Podaj wartosc szukanego elementu \n";
            cin >> liczba;
            tablica.szukaj( liczba );
        }
        if( menu == 8 )
        {
            cout << tablica.wyswietl();
        }
    }
}
void menuListy()
{
    int rozmiar;
    int opcja = 3;
    int menu = 6;
    cout << "\n Rozmiar listy: \n";
    cin >> rozmiar;
    lista lista( rozmiar );
    cout << lista.wyswietlodpocz();
}


void main()
{
    int exit = 0, menu;
    while( exit == 0 )
    {
        system( "cls" );
        cout << "Kacper Migala \n Projekt nr.1"
        << "\n 1-Menu Tablic \n 2-Menu Listy \n";
        cin >> menu;
        if( menu == 1 )
             menuTablicy();
       
        if( menu == 2 )
             menuListy();
       
        exit = 1;
    }
    system( "Pause" );
}
P-129452
pekfos
» 2015-03-29 17:22:04
C/C++
lista::lista()
{
    pierwszy = ostatni = NULL;
    rozmiar = 0;
}
lista::lista( int roz )
{
    int j;
    for( int i = 0; i < roz; i++ )
    {
        j = rand();
        dodajkon( j );
       
    }
    rozmiar = roz;
}
Nie zerujesz pól w konstruktorze z argumentem.

Popraw dodajkon():
C/C++
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;
        nowy->wartosc = war;
        nowy->poprzedni = ostatni; //
        nowy->nastepny = NULL; //
        ostatni->nastepny = nowy; //
        ostatni = nowy;
        rozmiar++;
    }
}
P-129454
cryuff
Temat założony przez niniejszego użytkownika
» 2015-03-29 17:27:41
Zmieniłem na coś takiego jednak nadal nie działa w tym samym punkcie:

C/C++
lista::lista( int roz )
{
   
    pierwszy = ostatni = NULL;
    rozmiar = 0;
    int j;
    for( int i = 0; i < roz; i++ )
    { pierwszy = ostatni = NULL;
        j = rand();
        dodajkon( j );
       
    }
    rozmiar = roz;
}

Wskazuje mi przy breaku na tę linię:
C/C++
ostatni->nastepny = nowy; //
P-129455
pekfos
» 2015-03-29 17:31:56
Kiedy? Dla takiego main() działa:
C/C++
int main()
{
    lista l( 5 );
    cout << l.wyswietlodpocz();
    cout << l.wyswietlodkon();
}
P-129457
cryuff
Temat założony przez niniejszego użytkownika
» 2015-03-29 17:33:04
Jak podaje rozmiar listy.
P-129458
cryuff
Temat założony przez niniejszego użytkownika
» 2015-03-29 17:34:25
Zmieniłem maina na identycznego nadal mi wywala błąd.
Tak wygląda teraz lista
C/C++
#include "lista.h"
#include "biblioteczka.h"

lista::lista()
{
    pierwszy = ostatni = NULL;
    rozmiar = 0;
}
lista::lista( int roz )
{
   
    pierwszy = ostatni = NULL;
    rozmiar = 0;
    int j;
    for( int i = 0; i < roz; i++ )
    { pierwszy = ostatni = NULL;
        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;
        nowy->wartosc = war;
        nowy->poprzedni = ostatni; //
        nowy->nastepny = NULL; //
        ostatni->nastepny = nowy; //
        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-129459
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona