KamilosD Temat założony przez niniejszego użytkownika |
» 2015-05-10 22:05:07 Dobra. Posiedziałem i zauważyłem, że prawidłowo tworzy mi listę przy addedge. Jak widać w załączonym kodzie, dodałem wiadomość "stworzono liste". Przed tym żadnego crashu. Problem występował przy jej wczytaniu, kiedy brało ogromną wartość "wierz" nie wiadomo skąd. Zmieniłem odpowiednio wszystkie funkcje by wartość ta była prawidłowa. I niby jest bo wyświetla w display1 przed pętlą, że wierz jest równy ilości wierzchołków. Mimo tego i tak funkcja wyświetlenia w liście crashuje i tworzy dodatkowe wierzchołki. Np tworząc ich 30, dorabia jeszcze 2 z pustymi wartościami i crash :/ EDIT: DZIAŁA! :D Jestem mózg. Wybaczcie mi to moje trucie dupy... Jestem chory i do tego kodzę dzisiaj z 10 godzin. Przy wyświetlaniu może panować mały burdel, wyrzucam też na ekran kilka informacji pomocniczych o ilości wierzchołków itd. :) Wielkie dzieki. Ale mimo wszystko prosiłbym jeszcze o nie zamykanie tematu. EDIT 2: Jest jeszcze dziwna rzecz. Przy tworzeniu grafu o wielkości 25, 50, 100 itd wszystko ok z listą, zaś przy mniejszej wartości jak np 15 crash :/ Bardzo dziwne #include <iostream> #include <fstream> #include <cstdlib> #include <string> #include <stdlib.h> #include <iomanip> #include <ctime> #include <conio.h>
using namespace std;
struct krawedzie { int waga, wp, wk; };
struct listakraw { int wk, waga; listakraw * next; };
class klgraf { public: int wierz, kraw; float gest; krawedzie * tab; char ** macierz; void readfromfile( string nazwa ); void display(); void createrand(); };
class listgraf : public klgraf { public: friend class klgraf; listakraw * head; listakraw ** tablist; void readfromfile( klgraf * obmacgraf, string nazwa ); void display1( klgraf * obmacgraf ); };
void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab );
void klgraf::readfromfile( string nazwa ) { ifstream plik; plik.open( nazwa.c_str(), ios::in ); if( !plik ) cout << "\n\nBLAD WCZYTYWANIA PLIKU! Podano nieprawidlowa nazwe lub plik nie istnieje.\n\n" << endl; else { int i, j, wp1, wk1, waga1, w1, k1; plik >> k1; plik >> w1; wierz = w1; kraw = k1; macierz = new char *[ wierz ]; tab = new krawedzie[ kraw ]; for( i = 0; i < wierz; i++ ) macierz[ i ] = new char[ wierz ]; for( i = 0; i < wierz; i++ ) for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0; cout << "\nLiczba krawedzi: " << kraw << "\nLiczba wierzcholkow: " << wierz << endl; for( i = 0; i < kraw; i++ ) { plik >> tab[ i ].wp; plik >> tab[ i ].wk; plik >> tab[ i ].waga; macierz[ tab[ i ].wp ][ tab[ i ].wk ] = tab[ i ].waga; macierz[ tab[ i ].wk ][ tab[ i ].wp ] = tab[ i ].waga; } display(); plik.close(); } }
void listgraf::readfromfile( klgraf * obmacgraf, string nazwa ) { ifstream plik; plik.open( nazwa.c_str(), ios::in ); int i, j, wp1, wk1, waga1, w1, k1; plik >> k1; plik >> w1; wierz = w1; kraw = k1; tablist = new listakraw *[ wierz ]; for( i = 0; i < wierz; i++ ) tablist[ i ] = NULL; listakraw * temp1, * temp2; for( i = 0; i < kraw; i++ ) { temp1 = new listakraw; temp2 = new listakraw; plik >> wp1; plik >> wk1; plik >> waga1; temp1->wk = wk1; temp1->waga = waga1; temp1->next = tablist[ wp1 ]; tablist[ wp1 ] = temp1; temp2->wk = wp1; temp2->waga = waga1; temp2->next = tablist[ wk1 ]; tablist[ wk1 ] = temp2; } display1( obmacgraf ); plik.close(); }
void klgraf::display() { int i, j; cout << "\n\nWyswietlenie macierzowo:\n\n "; for( i = 0; i < wierz; i++ ) cout << setw( 3 ) << i; cout << endl << endl; for( i = 0; i < wierz; i++ ) { cout << setw( 3 ) << i; for( j = 0; j < wierz; j++ ) cout << setw( 3 ) <<( int ) macierz[ i ][ j ]; cout << endl; } int pomoc = 0; for( i = 0; i < wierz; i++ ) for( int j = 0; j < wierz; j++ ) if( macierz[ i ][ j ] == 1 ) pomoc++; cout << endl << endl; system( "pause" ); }
void listgraf::display1( klgraf * obmacgraf ) { cout << "\n\nWyswietlenie listowo (np. 2w1 oznacza kolejny wierzcholek o indeksie 2 o wadze krawedzi 1):\n\n"; cout << endl << "wierz " << obmacgraf->wierz << endl; int wierzcholki = obmacgraf->wierz; listakraw * temp = new listakraw; for( int i = 0; i < wierzcholki; i++ ) { cout << "lista[" << i << "] = "; temp = tablist[ i ]; while( temp ) { cout << setw( 4 ) << temp->wk << "w" << temp->waga; temp = temp->next; } cout << "\nWyswietlono " << i + 1 << " element listy\n"; } cout << endl << endl; system( "pause" ); }
void klgraf::createrand() { int w1, k1, maxkraw, wp1, wk1, n, i, j, waga1; n = 0; int pomoc = 0; system( "cls" ); cout << "Ilu wierzcholkowy graf chcesz stworzyc?: "; cin >> w1; do { system( "cls" ); cout << "Liczba wierzcholkow: " << w1 << "\nPodaj gestosc grafu (podaj w %): "; cin >> gest; } while( gest < 1 && gest > 100 ); wierz = w1; system( "cls" ); cout << "Liczba wierzcholkow: " << wierz << "\nGestosc grafu: " << gest << "%"; gest = gest / 100; maxkraw =(( wierz *( wierz - 1 ) ) / 2 ); k1 = gest * maxkraw; kraw = k1; cout << "\nMaksymalna liczba krawedzi " << maxkraw << "\nLiczba krawedzi " << kraw << "\nGestosc " << gest << "\nLiczba wierzcholkow " << wierz << endl; macierz = new char *[ wierz ]; tab = new krawedzie[ kraw ]; for( i = 0; i < wierz; i++ ) macierz[ i ] = new char[ wierz ]; for( i = 0; i < wierz; i++ ) for( int j = 0; j < wierz; j++ ) macierz[ i ][ j ] = 0; for( i = 0; i < kraw; i++ ) { if( i < wierz - 1 || pomoc == 0 ) { if( i == wierz - 1 ) { pomoc = 1; continue; } waga1 =( rand() % 2 + 2 ); wk1 = n + 1; wp1 = n; if( wk1 == wp1 ) { i--; continue; } if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 ) { i--; continue; } tab[ i ].wp = wp1; tab[ i ].wk = wk1; tab[ i ].waga = waga1; macierz[ wp1 ][ wk1 ] = tab[ i ].waga; macierz[ wk1 ][ wp1 ] = tab[ i ].waga; n++; } else if( pomoc == 1 ) { waga1 =( rand() % 2 + 2 ); wk1 =( rand() %( wierz ) ); wp1 =( rand() %( wierz ) ); if( wk1 == wp1 ) { i--; continue; } if( macierz[ wp1 ][ wk1 ] != 0 || macierz[ wk1 ][ wp1 ] != 0 ) { i--; continue; } tab[ i ].wp = wp1; tab[ i ].wk = wk1; tab[ i ].waga = waga1; macierz[ wp1 ][ wk1 ] = tab[ i ].waga; macierz[ wk1 ][ wp1 ] = tab[ i ].waga; } } display(); }
void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab ) { int from, to, waga1, ile; ile = obmacgraf->kraw; cout << "\n\nkraw: " << obmacgraf->kraw << endl << endl; listakraw * t1, * t2; for( int i = 0; i < obmacgraf->kraw; i++ ) { from = tab[ i ].wp; to = tab[ i ].wk; waga1 = tab[ i ].waga; t1 = new listakraw; t2 = new listakraw; t1->waga = waga1; t1->wk = to; t2->waga = waga1; t2->wk = from; t1->next = tablist[ from ]; tablist[ from ] = t1; t2->next = tablist[ to ]; tablist[ to ] = t2; } cout << "\n\nStworzono liste\n\n"; system( "pause" ); }
int main( int argc, char ** argv ) { srand( time( 0 ) ); klgraf obmacgraf; klgraf(); listgraf obligraf; menuglowne: int wybor; do { system( "cls" ); cout << "Kamil Dzialek (209991) - SDIZO Projekt II\n\n" << "Wybierz problem, ktory chcesz rozwiazac:\n" << "1 - wyznaczanie minimalnego drzewa rozpinajacego\n" << "2 - wyznaczanie najkrotszej sciezki w grafie\n" << "3 - koniec programu\n\n" << "Podaj opcje: "; cin >> wybor; switch( wybor ) { case 1: { int wyb1; do { mstchoice: system( "cls" ); cout << "Co chcesz zrobic?:\n" << "1 - Wczytaj z pliku\n" << "2 - Wygeneruj losowo\n" << "3 - Wyswietl listowo i macierzowo na ekranie\n" << "4 - Algorytm Prima\n" << "5 - Algorytm Kruskala\n" << "0 - Powrot do poprzedniego menu\n\n" << "Podaj opcje: "; cin >> wyb1; system( "cls" ); switch( wyb1 ) { case 1: { system( "cls" ); string nazwa; cout << "Podaj nazwe pliku .txt do wczytania (pamietaj o dodaniu rozszerzenia '.txt'!):\n"; cin >> nazwa; obmacgraf.readfromfile( nazwa ); obligraf.readfromfile( & obmacgraf, nazwa ); break; } case 2: { system( "cls" ); obmacgraf.createrand(); obligraf.tablist = new listakraw *[ obmacgraf.wierz ]; for( int i = 0; i < obmacgraf.wierz; i++ ) obligraf.tablist[ i ] = NULL; addedge( & obmacgraf, obligraf.tablist, obmacgraf.tab ); obligraf.display1( & obmacgraf ); break; } case 3: { obmacgraf.display(); obligraf.display1( & obmacgraf ); break; } } } while( wyb1 != 0 ); } } } while( wybor != 3 ); system( "cls" ); cout << "KONIEC PROGRAMU\n\n"; system( "pause" ); return 0; }
|