#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;
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;
}
#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;
}