Скачиваний:
10
Добавлен:
01.05.2014
Размер:
5.12 Кб
Скачать
#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);
		std::list<int> getElemsList();

		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>
std::list<int> CGraph<T> ::getElemsList()
{
	return l;
}

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);
//	pair<int,int> rib2(_second,_first);

	if (lines.find(rib1)->second==1)
	{
		lines.find(rib1)->second=0;
//		lines.find(rib2)->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;
}
Соседние файлы в папке lab22