Lista dwukierunkowa - błąd w działaniu programu
Ostatnio zmodyfikowano 2015-03-29 17:42
cryuff Temat założony przez niniejszego użytkownika |
» 2015-03-29 16:55:10 Dostaje też unhandled exception i program przerywa działanie. |
|
pekfos |
» 2015-03-29 17:08:10 Podaj kompletny aktualny kod. |
|
cryuff Temat założony przez niniejszego użytkownika |
» 2015-03-29 17:12:03 lista.cpp #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 #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 #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(); 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(); 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(); 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(); 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(); 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(); 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" ); }
|
|
pekfos |
» 2015-03-29 17:22:04 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(): 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++; } } |
|
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: 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ę: ostatni->nastepny = nowy;
|
|
pekfos |
» 2015-03-29 17:31:56 Kiedy? Dla takiego main() działa: int main() { lista l( 5 ); cout << l.wyswietlodpocz(); cout << l.wyswietlodkon(); }
|
|
cryuff Temat założony przez niniejszego użytkownika |
» 2015-03-29 17:33:04 Jak podaje rozmiar listy. |
|
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 #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; }
|
|
1 « 2 » 3 |