Скачиваний:
19
Добавлен:
01.05.2014
Размер:
148.99 Кб
Скачать

Файл cGraph.H

#pragma once

#include<iostream>

#include<vector>

#include<map>

#include<list>

#include<new>

#include "GetError.h"

#include "InsertError.h"

#include "DelError.h"

using namespace std;

template <class T>

class CGraph

{ list<int> l; //список номеров вершин

map<int, T> elems; //список пар номер - элемент

multimap<pair<int, int>, int> lines; //список ребер

bool checkList(int _index)

{

list<int>::iterator lit;

lit=l.begin();

while(lit!=l.end())

{

if (*lit==_index){return true;}

lit++;

}

return false;

}

public :

CGraph();

void AddElement(T _elem, int _index);

void AddLine(int _first, int _second);

void delLine(int _first,int _second);

void delElem(int _index);

int getCount();

int getNext(int _index);

T getElement(int _index);

list<int> getNextWays(int _index); //вернуть список всех вершин

T getElementByNom(int number); //вернуть элемент по порядковуму номеру

void printElems()

{ list<int>::iterator lit;

lit=l.begin();

while(lit!=l.end())

{

cout<<elems.find(*lit)->first<<" "<<elems.find(*lit)->second<<endl;

lit++;

}

}

void printLines()

{ list<int>::iterator lit1;

list<int>::iterator lit2;

lit1=l.begin();

while(lit1!=l.end())

{

lit2=l.begin();

while(lit2!=l.end())

{

if (*lit1!=*lit2)

{

pair<int,int> rib(*lit1,*lit2);

cout<<*lit1<<" "<<*lit2<<" ";

cout<<lines.find(rib)->second<<endl;

}

lit2++;

}

lit1++;

}

}

void printList()

{

list<int>::iterator lit;

lit=l.begin();

while(lit!=l.end())

{

cout<<*lit<<" ";

lit++;

}

cout<<endl;

}

};

template<class T>

CGraph<T> :: CGraph()

{

}

template<class T>

void CGraph<T> :: AddElement(T _elem, int _index)

{if(!checkList(_index))

{

l.push_back(_index);

list<int>::iterator lit;

lit=l.begin();

elems.insert(pair<int, T>(_index, _elem));

while(lit!=l.end())

{

pair<int,int> rib1(_index,elems.find(*lit)->first);

pair<int,int> rib2(elems.find(*lit)->first,_index);

lines.insert(pair<pair<int,int>,int>(rib1,0));

lines.insert(pair<pair<int,int>,int>(rib2,0));

lit++;

}

cout << "inserted element N" << _index << endl;

}

else

{ int newelem=0;

list<int>::iterator lit;

lit=l.begin();

while(lit!=l.end())

{

if (*lit>newelem){newelem=*lit+1;}

lit++;

}

throw InsertError("AddElement","Insert not unique index",_index,newelem);//искл сит

}

}

template<class T>

void CGraph<T> :: AddLine(int _first, int _second)

{

if(!checkList(_first))

{

throw InsertError("AddLine","No elements for this index",_first,-1);

}

if(!checkList(_second))

{

throw InsertError("AddLine","No elements for this index",_second,-1);

}

pair<int,int> rib1(_first,_second);

// pair<int,int> rib2(_second,_first);

lines.find(rib1)->second=1;

// lines.find(rib2)->second=-1;

}

template<class T>

void CGraph<T> ::delLine(int _first,int _second)

{

if(!checkList(_first))

{

throw DelError("delLine","No elements for this index",_first,l.size());

}

if(!checkList(_second))

{

throw DelError("delLine","No elements for this index",_second,l.size());

}

pair<int,int> rib1(_first,_second);

if (lines.find(rib1)->second==1)

{

lines.find(rib1)->second=0;

}

}

template<class T>

void CGraph<T> ::delElem(int _index)

{

int oldsize=l.size();

elems.erase(_index);

l.remove(_index);

list<int>::iterator lit1;

lit1=l.begin();

while (lit1!=l.end())

{

pair<int,int> rib1(_index,*lit1);

pair<int,int> rib2(*lit1,_index);

lines.erase(rib1);

lines.erase(rib2);

lit1++;

}

if (oldsize==l.size())

{

throw DelError("delElem","not deleted",_index,oldsize);//искл сит

}

}

template<class T>

int CGraph<T> ::getNext(int _index)

{

list<int>::iterator lit;

lit=l.begin();

while(lit!=l.end())

{

if (*lit==_index)

{lit++; return *lit;}

lit++;

}

throw GetError("getNext","No Next element",_index);//искл сит

}

template<class T>

int CGraph<T> ::getCount()

{return l.size();}

template<class T>

T CGraph<T> ::getElement(int _index)

{

if (checkList(_index))

{

return elems.find(_index)->second;

}

else

{ throw GetError("getElement","No element for this index",_index);//искл сит}

}

template<class T>

T CGraph<T> ::getElementByNom(int number)

{

if (number<l.size())

{

list<int>::iterator lit;

lit=l.begin();

for (int i=0;i<number;i++)

{lit++;}

return getElement(*lit);

}

else

{throw GetError("getElementByNom","No element for this number",number);//искл сит}

}

template<class T>

list<int> CGraph<T> ::getNextWays(int _index)

{

list<int> rlist;

list<int>::iterator lit1;

lit1=l.begin();

while(lit1!=l.end())

{

pair<int,int> rib1(_index,*lit1);

if (lines.find(rib1)->second==1)

{

rlist.push_back(*lit1);

}

lit1++;

}

return rlist;

}

Соседние файлы в папке Лабораторная работа 13