Napisałem tu program wyznaczajacy cykl Eulera w grafie, a sam graf jest stworzony w dość prymitywny sposób w mainie (ten graf posiada cykl Eulera)
#include <iostream>
#include <stack>
using namespace std;
class node;
class vertex;
stack <int> Stack;
class node
{
public:
node() : ptr(NULL){}
vertex *ptr;
};
//vertex czyli dowolny wierzcholek w naszym grafie
class vertex
{
public:
vertex(int iden,vertex *nxt):id(iden),next(nxt){}
vertex *next;
int id;
};
void remove_edge(node Graph[],int w, int v)
{
vertex *ptr=Graph[w].ptr;
if(ptr->id==v)
{
vertex *temp=ptr->next;
delete temp;
Graph[w].ptr=temp;
return;
}
while(ptr->next)
{
if(ptr->next->id==v)
{
vertex *temp=ptr->next->next;
delete ptr->next;
ptr->next=temp;
return;
}
ptr=ptr->next;
}
}
int tour (node Graph[], int v)
{
while (true)
{ // program destroys graph
vertex *ptr = Graph[v].ptr;
if (ptr == NULL)
return v;
int w = ptr->id;
Stack.push(w);
remove_edge(Graph,v, w); // delete two Graph objects
remove_edge(Graph,w, v);
v = w;
}
}
int main()
{
const int Nodes=7;
node my_graph[Nodes];
my_graph[0].ptr=new vertex(1,new vertex(5,new vertex(6,NULL)));
my_graph[1].ptr=new vertex(0,new vertex(2,NULL));
my_graph[2].ptr=new vertex(1,new vertex(3,NULL));
my_graph[3].ptr=new vertex(2,new vertex(4,NULL));
my_graph[4].ptr=new vertex(2,new vertex(3,new vertex(5,new vertex(6,NULL))));
my_graph[5].ptr=new vertex(0,new vertex(4,NULL));
my_graph[6].ptr=new vertex(0,new vertex(4,NULL));
int v=0;
while (tour(my_graph, v) == v && !Stack.empty())
{
v = Stack.top();
Stack.pop();
cout << " -" << v;
}
//remove_edge(my_graph,4,7);
return 0;
}
Dlaczego program się wysypuje?