邻接矩阵

#include <iostream>
#include <strstream>
#include <string>
using namespace std;
//定义把无权图或有全图转为邻接矩阵
class CMatrix
{
public:
    //构造函数,n为图的顶点个数
    CMatrix():m_matrix(NULL), m_n(0) { }
    //析构函数,回收内存
    ~CMatrix() {
        if(NULL != m_matrix){
            for (int i=0; i<m_n; ++i)
                if( NULL != m_matrix[i] ) //判断是否分配内存
                    delete [] m_matrix[i];
            delete m_matrix;
        }
    }
    void CreateMatrix ( );
    void PrintMatrix ( );
    int **GetMatrix ();
private:
    int **m_matrix; //矩阵
    int m_n;       //矩阵的秩
    
};
//创建矩阵
void CMatrix::CreateMatrix () {

    cout<<"输入图的顶点数n:";
    cin>>m_n;
    //申请内存
    for (int i=0; i<m_n; ++i)
        m_matrix = new int*[m_n];
    for (int j=0; j<m_n; ++j)
        m_matrix[j] = new int[m_n];
    //初始化Matrix
    for (int i=0; i<m_n; ++i) {
        for(int j=0; j<m_n; ++j) {
            m_matrix[i][j] = 0;
        }
    }
    cout<<"输入边集(如:{<1,2>}\\{(1,2)},若为带权图则为{<1,2>3}\\{(1,2)3}:"<<endl;
    string str;
    cin>>str;
    //将 string 转换成 char*
    char *cstr = new char[str.size()+1]; //最后加上'\0'
    int i=0;
    for(i=0; i != str.size(); ++i)
        cstr[i] = str.at(i);
    cstr[i]='\0';
    cout<<cstr<<endl;


    istrstream strin(cstr);
    char cTmp, cEdge1, cEdge2, cEdge3;//cEdge1存 < ,cEdge2存 , ,cEdge3存 >
    int iBgn, iEnd; //边的起点、终点
    strin>>cTmp;
    while (true) {
         char cPeek;
        cPeek = strin.peek();
        //边集读取完成退出
        if( '}' == cTmp || '}' == cPeek) {
            break;
        }
        
        //读取边集<a,b> 或 (a,b)
        strin>>cEdge1>>iBgn>>cEdge2>>iEnd>>cEdge3;
        cout<<cEdge1<<iBgn<<cEdge2<<iEnd<<cEdge3<<endl;
        //继续读取下一条边
        if(  cTmp=='{' || cTmp==',') {
            m_matrix[iBgn][iEnd] = 1;
        }
    
        //peek下一个字符,看是否为带权图
        cTmp = strin.peek();
        cout<<cTmp<<endl;
        //此图是否为 带权图
        if ( cTmp>='0' && cTmp<='9') {
            int weight =0;
            strin>>weight;
            m_matrix[iBgn][iEnd] = weight;
            strin>>cTmp;//读取逗号
        } else {
            //cTmp可能为 ‘,’, }
            strin>>cTmp;
        }
    }
}
//打印Matrix
void CMatrix::PrintMatrix() {
    cout<<"该图的邻接矩阵如下:"<<endl;
    for (int i=0; i<m_n; ++i) {
        cout<<"\t\t";
        for (int j=0; j<m_n; ++j)
            cout<<m_matrix[i][j]<<'\t';
        cout<<'\n';
    }
}
//得到邻接矩阵
int **CMatrix::GetMatrix () {
    return this->m_matrix;
}

int main()
{
    CMatrix matrix;
    int **pMatrix = NULL;
    matrix.CreateMatrix();
    matrix.PrintMatrix();
    pMatrix = matrix.GetMatrix();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值