KamilosD Temat założony przez niniejszego użytkownika |
Problem z funkcją globalną (jako argumenty obiekty dwóch różnych klas) » 2015-05-10 13:33:30 Witam. Mam problem z funkcją addedge. Generuję losowo graf i wrzucam go do macierzy. Później, żeby przekopiować krawędzie z macierzy do listy, do stworzonej funkcji globalnej addedge chcę wrzucić tablicę ( od struktury krawedzie) przechowującącej krawędzie klasy klgraf i tablicę list (od struktury listakraw) z klasy listgraf. Przy kompilacji nie wyrzuca żadnych błędów, ale program crashuje przy 291 linii (zaraz po rozpoczęciu pętli for w metodzie addedge). Jest mi ktoś w stanie pomóc? #include <iostream> #include <fstream> #include <cstdlib> #include <string> #include <stdlib.h> #include <iomanip> #include <ctime> #include <conio.h>
using namespace std;
int wierz, kraw; float gest;
struct krawedzie { int waga, wp, wk; };
struct listakraw { int wk, waga; listakraw * next; };
class listgraf { public: friend class klgraf; listakraw * head; listakraw ** tablist; void readfromfile( string nazwa ); void display(); };
class klgraf { public: friend class listgraf; krawedzie * tab; char ** macierz; void readfromfile( string nazwa ); void display(); void createrand( listgraf * obligraf ); };
void addedge( 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 ]; krawedzie tab[ 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( 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; for( i = 0; i < kraw; i++ ) { listakraw * temp1 = new listakraw; 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; } display(); 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::display() { cout << "\n\nWyswietlenie listowo (np. 2w1 oznacza kolejny wierzcholek o indeksie 2 o wadze krawedzi 1):\n\n"; for( int i = 0; i < wierz; i++ ) { listakraw * temp = new listakraw; cout << "lista[" << i << "] = "; temp = tablist[ i ]; while( temp ) { cout << setw( 4 ) << temp->wk << "w" << temp->waga; temp = temp->next; } cout << endl; } cout << endl << endl; system( "pause" ); }
void klgraf::createrand( listgraf * obligraf ) { 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 ]; krawedzie tab[ 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 || pomoc == 0 ) { if( i == wierz - 1 ) { pomoc = 1; continue; } waga1 =( rand() % 3 ); wk1 =( rand() %( wierz ) ); 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 ) { n =( rand() %( wierz ) ); waga1 =( rand() % 3 ); wk1 =( rand() %( wierz ) ); 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; } } display(); }
void addedge( listakraw ** tablist, krawedzie * tab ) { int from, to, waga; for( int i = 0; i < kraw; i++ ) { from = tab[ i ].wp; to = tab[ i ].wk; waga = tab[ i ].waga; tablist[ from ]->wk = to; tablist[ to ]->wk = from; tablist[ from ]->waga = waga; tablist[ to ]->waga = waga; } }
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( nazwa ); break; } case 2: { system( "cls" ); obmacgraf.createrand( & obligraf ); obligraf.tablist = new listakraw *[ wierz ]; addedge( obligraf.tablist, obmacgraf.tab ); break; } case 3: { obmacgraf.display(); obligraf.display(); break; } } } while( wyb1 != 0 ); } } } while( wybor != 3 ); system( "cls" ); cout << "KONIEC PROGRAMU\n\n"; system( "pause" ); return 0; } |
|
pekfos |
» 2015-05-10 13:36:58 Nie mieszaj zmiennych globalnych z polami klas. |
|
KamilosD Temat założony przez niniejszego użytkownika |
» 2015-05-10 13:41:53 Why? Inaczej tego nie widzę. Bo w jaki sposób dwie różne klasy mają korzystać z tych samych zmiennych? (wybacz brak wiedzy, nie za wiele czasu spędziłem na kodzeniu xd) |
|
pekfos |
» 2015-05-10 13:50:26 Ilość krawędzi opisuje rozmiar tablicy z nimi, więc te dwie informacje muszą być razem. Jeśli możesz jakoś działać na tablicy, to będziesz mieć też dostęp do rozmiaru. Obecnie masz do tego jedną zmienną globalną, opisującą rozmiar ostatniej utworzonej tablicy, użycie jej w kontekście jakiejkolwiek innej tablicy jest niepoprawne. Dodatkowo, ten twój program to jeden wielki wyciek pamięci. |
|
KamilosD Temat założony przez niniejszego użytkownika |
» 2015-05-10 13:59:00 Poprawiam program. Kod wygląda na razie tak. Co masz na myśli mówiąc wyciek pamięci? Chodzi Ci może o nie kasowanie zmiennych typu temp1, temp2? Coś jeszcze? EDIT: Po wpisaniu cout << endl << from << endl << to << endl << waga; do pętli wyświetla jakieś losowe miejsca w pamięci. Tutaj teraz leży problem. #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: listakraw * head; listakraw ** tablist; void readfromfile( string nazwa ); void display1(); };
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 ]; krawedzie tab[ 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( 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; for( i = 0; i < kraw; i++ ) { listakraw * temp1 = new listakraw; 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; } display(); 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() { cout << "\n\nWyswietlenie listowo (np. 2w1 oznacza kolejny wierzcholek o indeksie 2 o wadze krawedzi 1):\n\n"; for( int i = 0; i < wierz; i++ ) { listakraw * temp = new listakraw; cout << "lista[" << i << "] = "; temp = tablist[ i ]; while( temp ) { cout << setw( 4 ) << temp->wk << "w" << temp->waga; temp = temp->next; } cout << endl; } 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 ]; krawedzie tab[ 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 || pomoc == 0 ) { if( i == wierz - 1 ) { pomoc = 1; continue; } waga1 =( rand() % 3 ); wk1 =( rand() %( wierz ) ); 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 ) { n =( rand() %( wierz ) ); waga1 =( rand() % 3 ); wk1 =( rand() %( wierz ) ); 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; } } display(); }
void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab ) { int from, to, waga, ile; ile = obmacgraf->kraw; cout << "\n\nIle: " << ile << endl << endl; system( "pause" ); for( int i = 0; i < ile; i++ ) { from = tab[ i ].wp; to = tab[ i ].wk; waga = tab[ i ].waga; tablist[ from ]->wk = to; tablist[ to ]->wk = from; tablist[ from ]->waga = waga; tablist[ to ]->waga = waga; } }
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( nazwa ); break; } case 2: { system( "cls" ); obmacgraf.createrand(); obligraf.tablist = new listakraw *[ obmacgraf.wierz ]; addedge( & obmacgraf, obligraf.tablist, obmacgraf.tab ); break; } case 3: { obmacgraf.display(); obligraf.display(); break; } } } while( wyb1 != 0 ); } } } while( wybor != 3 ); system( "cls" ); cout << "KONIEC PROGRAMU\n\n"; system( "pause" ); return 0; } |
|
pekfos |
» 2015-05-10 14:03:05 Rozumiem, że błąd dalej występuje i w tym samym miejscu? Co robisz, żeby go wywołać i jakimi danymi? Chodzi Ci może o nie kasowanie zmiennych typu temp1, temp2? Coś jeszcze? |
Chodzi o niekasowanie żadnej zaalokowanej pamięci. |
|
KamilosD Temat założony przez niniejszego użytkownika |
» 2015-05-10 14:14:27 Dodałem kilka destruktorów. Wyrzuca jakieś miejsca w pamięci przy odczytaniu wartości to, from i waga w petli metody addedge. #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: listakraw * head; listakraw ** tablist; void readfromfile( string nazwa ); void display1(); };
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 { this->~klgraf(); int i, j, wp1, wk1, waga1, w1, k1; plik >> k1; plik >> w1; wierz = w1; kraw = k1; macierz = new char *[ wierz ]; krawedzie tab[ 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( 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; this->~listgraf(); tablist = new listakraw *[ wierz ]; for( i = 0; i < wierz; i++ ) tablist[ i ] = NULL; for( i = 0; i < kraw; i++ ) { listakraw * temp1 = new listakraw; 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; delete temp1; delete temp2; } display(); 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() { cout << "\n\nWyswietlenie listowo (np. 2w1 oznacza kolejny wierzcholek o indeksie 2 o wadze krawedzi 1):\n\n"; for( int i = 0; i < wierz; i++ ) { listakraw * temp = new listakraw; cout << "lista[" << i << "] = "; temp = tablist[ i ]; while( temp ) { cout << setw( 4 ) << temp->wk << "w" << temp->waga; temp = temp->next; } cout << endl; } 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; this->~klgraf(); macierz = new char *[ wierz ]; krawedzie tab[ 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 || pomoc == 0 ) { if( i == wierz - 1 ) { pomoc = 1; continue; } waga1 =( rand() % 3 ); wk1 =( rand() %( wierz ) ); 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 ) { n =( rand() %( wierz ) ); waga1 =( rand() % 3 ); wk1 =( rand() %( wierz ) ); 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; } } display(); }
void addedge( klgraf * obmacgraf, listakraw ** tablist, krawedzie * tab ) { int from, to, waga, ile; ile = obmacgraf->kraw; cout << "\n\nIle: " << ile << endl << endl; for( int i = 0; i < ile; i++ ) { from = tab[ i ].wp; to = tab[ i ].wk; waga = tab[ i ].waga; cout << endl << from << endl << to << endl << waga; system( "pause" ); tablist[ from ]->wk = to; tablist[ to ]->wk = from; tablist[ from ]->waga = waga; tablist[ to ]->waga = waga; } }
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( nazwa ); break; } case 2: { system( "cls" ); obmacgraf.createrand(); obligraf.~listgraf(); obligraf.tablist = new listakraw *[ obmacgraf.wierz ]; addedge( & obmacgraf, obligraf.tablist, obmacgraf.tab ); break; } case 3: { obmacgraf.display(); obligraf.display(); break; } } } while( wyb1 != 0 ); } } } while( wybor != 3 ); system( "cls" ); cout << "KONIEC PROGRAMU\n\n"; system( "pause" ); return 0; } |
|
pekfos |
» 2015-05-10 14:18:11 Nie możesz ręcznie wywoływać destruktorów, a jedyne dwie zmienne dla których dopisałeś usuwanie akurat nie powinny być usuwane w tym miejscu. |
|
« 1 » 2 3 4 5 |