#include <iostream>
#include <fstream>
#include <iterator>
#include <list>
using namespace std;
#define MAX_EDGE 100
#define SAFE_DEL(p) { if (p!=NULL) { delete [] p;}}
int ImportToArray(const char *filename,int *array) //将filename内的纯数字文本导入数组array;
{
int count=0;
ifstream fin;
fin.open(filename);
if( fin.fail() )
{
cout<<"file read fail!"<<endl;
return -1;
}
while( fin.eof() ==false )
fin>>array[count++];
fin.close();
return count;
}
void CreateAdjTable(list<int> *AdjTable,int *array,int count) //创建邻接表
{
for(int i=2;i<count;i+=2)
{
AdjTable[ array[i] ].push_back( array[i+1] );
}
}
void CreateReverseAdjTable(list<int> *AdjTable,int *array,int count) //创建反图邻接表
{
for(int i=2;i<count;i+=2)
{
AdjTable[ array[i+1] ].push_back( array[i] );
}
}
void ShowAdjTable(list<int> *AdjTable,int vertexNum)
{
for(int i=0;i<vertexNum;i++)
{
cout<<i<<":";
copy(AdjTable[i].begin(),AdjTable[i].end(), ostream_iterator<int>(cout," "));
cout<<endl;
}
}
void ReverseAdjTable(list<int> *AdjTable,list<int> *RAdjTable,int vertexNum) //根据邻接表创建反图邻接表
{
list<int>::iterator it;
for(int i=0;i<vertexNum;i++)
for(it=AdjTable[i].begin();it!=AdjTable[i].end();++it)
{
RAdjTable[ *it ].push_back(i);
}
}
void main()
{
int *array=new int[MAX_EDGE];
int count=ImportToArray("tinyDG.txt",array);//注意文本最后有无空行
int vertexNum=array[0],edgeNum=array[1];
list<int> *AdjTable=new list<int>[vertexNum];
list<int> *RAdjTable=new list<int>[vertexNum];
CreateAdjTable(AdjTable,array,count-1); //创建邻接表
ReverseAdjTable(AdjTable,RAdjTable,vertexNum); //创建反图邻接表
cout<<"邻接表:"<<endl;
ShowAdjTable(AdjTable,vertexNum);
cout<<"反图邻接表:"<<endl;
ShowAdjTable(RAdjTable,vertexNum);
//
//销毁动态数组
for(int i=0;i<vertexNum;i++)
{
AdjTable[i].clear();
RAdjTable[i].clear();
}
SAFE_DEL(RAdjTable);
SAFE_DEL(AdjTable);
SAFE_DEL(array);
}