#include <cstdio>
#include <cstdlib>
#define MaxNum 10 //最大顶点数
typedef struct ArcNdoe
{
int talivex,headvex;
ArcNdoe *tlink,*hlink;
}ArcNdoe;
typedef struct VexNode
{
char vertex;
ArcNdoe *firstin,*firstout;
}VexNode;
typedef struct OLGraph
{
VexNode Vexlist[MaxNum];
int n,e;
} OLGraph;
//定位顶点Vex的下标位置
int Locate_vex(OLGraph* G,char vex)
{
for(int i=0;i<G->n;++i)
if(G->Vexlist[i].vertex==vex)
return i;
}
//创建图
void CreateGraph(OLGraph * G)
{
int i,j,k;
ArcNdoe *s;
int vex1,vex2;
printf("\n请输入有向图的顶点名称:");
for(i=0;i<G->n;++i)
{
scanf("\n%c",&G->Vexlist[i].vertex);
G->Vexlist[i].firstin=NULL;
G->Vexlist[i].firstout=NULL;
}
printf("\n请输入有向图中每条弧的弧尾顶点和弧头顶点名称:\n");
for(k=1;k<=G->e;++k)
{
printf("\n请输入第 %d 条弧的弧尾顶点名称:",k);
scanf("\n%c",&vex1);
printf("请输入第 %d 条弧的弧头顶点名称:",k);
scanf("\n%c",&vex2);
i=Locate_vex(G,vex1);
j=Locate_vex(G,vex2);
s=(ArcNdoe*)malloc(sizeof(ArcNdoe));
s->talivex=i;
s->headvex=j;
s->tlink=G->Vexlist[i].firstout;
s->hlink=G->Vexlist[j].firstin;
G->Vexlist[j].firstin=s;
G->Vexlist[i].firstout=s;
}
}
//打印图的信息
void PrintGraph(const OLGraph * G)
{
int i;
ArcNdoe* s=NULL;
printf("\n\n有向图有 %d 个顶点:",G->n);
for(i=0;i<G->n;++i)
printf(" %c ",G->Vexlist[i].vertex);
printf("\n\n有向图有 %d 条弧:",G->e);
printf("\n\n出度弧有:");
for(i=0;i< G->n;++i)
{
printf("\n\n%c -> ",G->Vexlist[i].vertex);
s=G->Vexlist[i].firstout;
while(s)
{
printf("%c ",G->Vexlist[s->headvex].vertex);
s=s->tlink;
}
}
printf("\n\n入度弧有:");
for(i=0;i<G->n;++i)
{
printf("\n\n%c <-",G->Vexlist[i].vertex);
s=G->Vexlist[i].firstin;
while(s)
{
printf(" %c",G->Vexlist[s->talivex].vertex);
s=s->hlink;
}
}
printf("\n");
}
//测试代码
int main()
{
OLGraph G;
printf("\n有向图的十字链表表结构存储.....");
printf("\n\n请输入有向图的顶点数:");
scanf("%d",&G.n);
printf("\n请输入有向图有多少条弧:");
scanf("%d",&G.e);
CreateGraph(&G);
PrintGraph(&G);
printf("\n");
return 0;
}