Files
PWrPEA2plus/ListGraph.cpp
T
2019-11-17 21:02:29 +01:00

168 lines
3.5 KiB
C++
Executable File

#include "ListGraph.h"
#include <iostream>
ListGraph::ListGraph(unsigned vertexNumber)
{
//ctor
this->vertexNumber = vertexNumber;
graphList = new element*[vertexNumber];
for(int i = 0; i < vertexNumber; i++)
graphList[i] = NULL;
}
ListGraph::~ListGraph()
{
//dtor
for(int i = 0; i < vertexNumber; i++)
{
if(graphList[i] != NULL)
{
element *position = graphList[i];
do
{
element *next = position->next;
delete position;
position = next;
}
while(position != NULL);
}
}
delete[] graphList;
}
bool ListGraph::addEdge(unsigned v, unsigned w, unsigned weight)
{
if(weight >= 1000)
// Waga krawedzi musi byc mniejsza od 1000
weight = 900;
if(graphList[v] == NULL)
{
graphList[v] = new element;
graphList[v]->vertex = w;
graphList[v]->weight = weight;
graphList[v]->next = NULL;
return true;
}
else
{
bool isAlready = false;
element *next = graphList[v];
element *position = NULL;
do
{
position = next;
next = next->next;
if(position->vertex == w)
{
isAlready = true;
break;
}
}
while(next != NULL);
if(!isAlready)
{
element *newEdge = new element;
newEdge->vertex = w;
newEdge->weight = weight;
newEdge->next = NULL;
position->next = newEdge;
return true;
}
else
return false;
}
}
bool ListGraph::removeEdge(unsigned v, unsigned w)
{
if(graphList[v] == NULL)
return false;
else
{
bool isAlready = false;
element *next = graphList[v];
element *position = NULL;
element *prev = NULL;
do
{
prev = position;
position = next;
next = next->next;
if(position->vertex == w)
{
isAlready = true;
break;
}
}
while(next != NULL);
if(!isAlready)
return false;
else
{
delete position;
if(prev != NULL)
prev->next = next;
else
graphList[v] = next;
return true;
}
}
}
unsigned ListGraph::getWeight(unsigned v, unsigned w)
{
if(graphList[v] == NULL)
return 0;
else
{
bool isAlready = false;
element *next = graphList[v];
element *position = NULL;
do
{
position = next;
next = next->next;
if(position->vertex == w)
{
isAlready = true;
break;
}
}
while(next != NULL);
if(!isAlready)
return 0;
else
return position->weight;
}
}
void ListGraph::displayGraph()
{
for(int i = 0; i < vertexNumber; i++)
{
std::cout << i << " -> ";
if(graphList[i] != NULL)
{
element *next = graphList[i];
element *position = NULL;
do
{
position = next;
next = next->next;
std::cout << position->vertex << '@' << position->weight << ' ';
}
while(next != NULL);
}
std::cout << std::endl;
}
}