123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- #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;
- }
- }
|