#include<string>
#include <iostream>
using namespace std;
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20//最大顶点个数
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct ArcBox{
int tailvex,headvex;
int info;
struct ArcBox *hlink,*tlink;
}ArcBox;
typedef struct VexNode{
string name;
ArcBox *firstin,*firstout;
}VexNode;
typedef struct{
VexNode xlist[MAX_VERTEX_NUM];
int vexnum,arcnum;//图的当前顶点数和弧数
GraphKind kind;//图的种类标志
}OLGraph;
int LocateVex(OLGraph G,string v)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(G.xlist[i].name==v)break;
}
return i;
}
void CreateDN(OLGraph &G)
{
int i,j,k;
string v1,v2;
ArcBox *s;
cout<<"图的顶点数:";
cin>>G.vexnum;
cout<<"图的弧数:";
cin>>G.arcnum;
cout<<"图的所有顶点名:";
for(i=0;i<G.vexnum;i++)
{
cin>>G.xlist[i].name;//构造顶点向量
G.xlist[i].firstin=NULL;G.xlist[i].firstout=NULL;//初始化指针
}
cout<<"输入各弧:";
for(k=0;k<G.arcnum;k++)//输入各弧并构造十字链表
{
cin>>v1>>v2;//输入各弧起点和终点
i=LocateVex(G,v1);
j=LocateVex(G,v2);//确定v1、v2在G中位置
s=new ArcBox;
s->tailvex=i;s->headvex=j;
s->tlink=G.xlist[i].firstout;s->hlink=G.xlist[j].firstin;
cin>>s->info;//对弧结点赋值
G.xlist[i].firstout=G.xlist[j].firstin=s;//完成在入弧和出弧链头的插入
}
}
int main()
{
OLGraph G;
G.kind=DN;
CreateDN(G);
return 0;
}