您的位置:首页 > 其它

第五周作业——1有向图邻接表表示及反向图构造

2014-06-13 00:55 465 查看
#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);  

}  


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: