邻接表

#include <iostream>
#include <strstream>
#include <string>
using namespace std;
//邻接表
class CEdgeNode
{
public:
    //构造函数
    CEdgeNode(int adjVex =0, int weight =0) :m_adjVex(adjVex), m_weight(weight), m_next(NULL),m_n(0), m_header(NULL) {}
    //析构函数
    ~CEdgeNode() {
        if(m_header !=NULL) {
            for(int i=0; i!=m_n; ++i) {
                if( m_header[i] != NULL)
                    delete m_header[i];
            }
            delete m_header;
        }
    }
    //创建邻接表
    void CreateEdgeNode();
    void SetWeight(int weight);
    //打印邻接表
    void PrintEdgeNode();
    //返回邻接点adjVex
    int GetAdjVex();
    
private:
    int m_adjVex; //邻接顶点
    int m_weight; //权值
    int m_n;     //顶点个数
    CEdgeNode **m_header; //邻接表表头
    CEdgeNode *m_next;
};
//
void CEdgeNode::CreateEdgeNode() {
    cout<<"该图顶点数为n:";
    cin>>m_n;
    this->m_header = new CEdgeNode*[this->m_n];
    for(int i=0; i != m_n; ++i)
        m_header[i] = NULL;

    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';
    //字符串流
    istrstream strin(cstr);
    char cTmp, cEdge1, cEdge2, cEdge3;//cEdge1存 < ,cEdge2存 , ,cEdge3存 >
    int iBgn, iEnd; //边的起点、终点
    CEdgeNode *p =NULL;
    strin>>cTmp;

    while (true) {

 char cPeek;
        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==',') {
            p = new CEdgeNode(iEnd,1);
            p->m_next = m_header[iBgn];
            m_header[iBgn] = p;
        }
        //peek下一个字符,看是否为带权图
        cTmp = strin.peek();
        cout<<cTmp<<endl;
        //此图是否为 带权图
        if ( cTmp>='0' && cTmp<='9') {
            strin>>m_weight;
            //设置权
            p->SetWeight(m_weight);
        }
        strin>>cTmp;//读取下个字符
    }
    //delete p;

}
//设置权
void CEdgeNode::SetWeight(int weight) {
    m_weight = weight;
}
//打印邻接表
void CEdgeNode::PrintEdgeNode(){
    cout<<"该图的邻接表:"<<endl;
    for(int i=0;i != m_n; ++i) {
        CEdgeNode *p = m_header[i];
        if( p!=NULL)
            printf("v%d -",i);
        while( p!= NULL) {
            printf("%d-> v%d ",p->m_weight,p->m_adjVex);
            p = p->m_next;
            if( p != NULL)
                printf("-");
        }
        cout<<endl;
    }
}
//返回邻接点adjVex
int CEdgeNode::GetAdjVex() {
    return m_adjVex;
}
int main()
{
    CEdgeNode edgeNode;
    edgeNode.CreateEdgeNode();
    edgeNode.PrintEdgeNode();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值