Napisałem taki program:
/*==============================================================================
system operacyjny: Windows XP Home
kompilator: Dev-C++ 4.9.9.2
===============================================================================*/
/*------------------------------------------------------------------------------
Program demonstruje dzialanie algorytmu DFS w zastosowaniu do sortowania
topologicznego grafu.
-Wykorzystuje reprezentacje listowa grafu.
-Posiada 3 zestawy danych wejsciowych w tym jeden zestaw to graf z cyklem.
-------------------------------------------------------------------------------*/
#include <iostream>
#include <string>
using namespace std;
typedef struct TNode //pojedynczy element lisy
{
int node; // numer wierzchołka
struct TNode * next; // następny element listy
};
class CGraph //klasa slurzaca do reprezentacji grafu w postaci ist sasiedztwa
{
unsigned V,E; // ilosc wierzcholkow i krawedzi
int wmax; //wierzcholek o maksymalnym numerze
int nTS;
int color[100], tab[100];//tabele pomocnicze
bool isDAG; //zmienna pomocnicza do wykrywania cykli
TNode **GLists, *p; // tablica wskazników na listy wierzchołków
//*******************************************************//
public:
CGraph(unsigned _V);
~CGraph();
void Insert(unsigned v,unsigned u);
void Show(void);//wyswietla graf w postaci tablicy list
void DFS(int v);//algorytm przeszukiwania DFS
void wsTOP(void);//sortowanie topologiczne grafu
};
//==========================================================
//-------------konstruktor----------------------------------
CGraph::CGraph(unsigned _V) : V(_V)
{
isDAG = true;
wmax=0;
GLists = new TNode*[V];
for(int i=0;i<V;++i) GLists[i]=NULL,color[i]=0, tab[i]=0 ;
}
//-------------destruktor----------------------------------
CGraph:: ~CGraph()
{
TNode *tmp;
int i=0;
while(GLists[i])
{
while(p->next)
{
tmp=p->next;
p->next=p->next->next;
delete tmp;
}
delete GLists[i];
i++;
}
}
//--------------Insert----------------------------------
void CGraph::Insert(unsigned v,unsigned u)
{
wmax = (v > wmax) ? v : wmax;// ustawianie wartosci wmax na najwiekszy numer wierzchoka
wmax = (u > wmax) ? u : wmax;
color[v]= 1;//wszystkie dodawane wierzcholki sa numerowne jedynkami
color[u]= 1;
p = new TNode;
p->next = GLists[v];
p->node = u;
GLists[v] = p;
}
//---------Show----------------------------------------------
void CGraph::Show(void)
{
for(int i = 1; i <= wmax; i++)
{
cout << i << ":";
p = GLists[i];
while(p)
{
cout << p->node << " ";
p = p->next;
}
cout << endl;
}
cout<<"\n\n";
}
//-------------------------DFS--------------------------------------------------
void CGraph::DFS(int i)
{
color[i] = 2;//wierzcholkowi aktualnie przetwarzanemu zmieniany jest przypisany przy Insercie numer 1 na 2
//wskaznik do glowy listy
while(p)
{
switch(color[p->node])
{
case 2 : isDAG = false; return ;//zostal wykryty cykl w grafie
case 1 : DFS(p->node);//rekurencyjne wywolanie
if(!isDAG) return ;
break;
}
p = p->next;
}
color[i] = 3;//wierzcholkowi przetworzonemu zmieniany jest przypisany numer z 2 na 3
tab[nTS++] = i;//wierzcholek dodawany jest na stos
}
//-----------wsTOP-----------------------------------------
void CGraph::wsTOP(void)
{
for(int i = 1; i <= wmax; i++)
{
if(color[i] == 1)
{
DFS(i);
if(!isDAG) break;
}
}
//efekt sortowania topologicznego jest wyswietlany
if(!isDAG) cout << "wykryto cykl";//komunikat o wykrutym cyklu
else for(int i = nTS - 1; i >= 0; i--) cout << tab[i] << " ";//zdejmowanie ze stosu
}
//==============================================================================
int main()
{
//-----zestaw danych wejsciowych nr. 2--------------
CGraph Obiekt(50);
cout<<"graf zbudowany jest z nastepujacych galezi:\n 1,2\n 1,6\n 2,5\n 2,4\n 3,2\n 3,4\n 3,5\n 4,6\n 6,5\n\n";
Obiekt.Insert(1,2);
Obiekt.Insert(1,6);
Obiekt.Insert(2,5);
Obiekt.Insert(2,4);
Obiekt.Insert(3,2);
Obiekt.Insert(3,4);
Obiekt.Insert(3,5);
Obiekt.Insert(4,6);
Obiekt.Insert(6,5);
cout<<"---Listowa reprezentacja grafu---"<<endl;
Obiekt.Show();
cout<<"---efekt sortowania topologicznego---\n"<<endl;
Obiekt.wsTOP();
cout<<"\n\n\n";
system("PAUSE");
}
I wszystko fajnie działa ale gdy chce stworzyć drugi obiekt typu CGraph program sie wysypuje.
Co dziwne nawet jak chce zadeklarować zmienną np. int w main() przed "Obiektem" wywoanie
metody "Obiekt.wsTOP()" kończy sie niepowodzeniem. Gdy uruchamiam program pod Linuxem metoda wsTOP() wcale nie działa.
Co może być tego przyczyną?