#include<stdio.h>
#include<malloc.h>
#define MAX_VERTEX_NUM 20typedef struct ArcBox{
int tailvex,headvex;//该弧的头和尾定点的位置
struct ArcBox *hlink,*tlink;//分别为弧头和弧尾相同的弧的链域
int *info;
}ArcBox;
typedef struct VexNode //顶点结点
{
char data; //顶点信息(标识)
ArcBox *firstin; //该顶点的第一条入弧
ArcBox *firstout; //该顶点的第一条出弧
}VexNode;
typedef struct //图的顶点列表
{
VexNode xlist[MAX_VERTEX_NUM]; //顶点列表
int vexnum,arcnum; //定点数,弧数
}OLGraph;
int Locate(OLGraph *G, char vex)
{
int i=0;
for(;i<G->vexnum;i++)
if(vex==G->xlist[i].data)
break;
return i;
}
OLGraph* CreateDG(OLGraph *G)
{
G=(OLGraph *)malloc(sizeof(OLGraph));
char vex1,vex2;
int in,out;//分别表示头和尾巴
ArcBox *p;printf("输入有向图的顶点数:\n");
scanf("%d",&G->vexnum);
printf("输入有向图的边数:\n");
scanf("%d",&G->arcnum);
printf("输入顶点值:");
int i=0;
printf("%d\n",G->vexnum);
for(i=0;i<G->vexnum;++i)
{
printf("第%d次输入\n",i);
printf("好奇葩\n");
fflush(stdin);
scanf("%c",&G->xlist[i].data);
G->xlist[i].firstin=G->xlist[i].firstout=NULL;
}
int k=0;
for(;k<G->arcnum;k++)
{
printf("输入弧%d(顶点1,顶点2)",k);
fflush(stdin);//清空缓冲区,避免对后面数据的影响
scanf("%c,%c",&vex1,&vex2);//输入一条弧的始点和终点
in =Locate(G,vex1);
out =Locate(G,vex2);
p=(ArcBox *)malloc(sizeof(ArcBox));
p->headvex=in; p->tailvex=out;
p->hlink=G->xlist[in].firstin;
p->tlink=G->xlist[out].firstout;
G->xlist[in].firstin=G->xlist[out].firstout=p;
scanf("%d",p->info);
}return G;
}int main()
{
OLGraph *G;
G=CreateDG(G);
system("pause");
}
注:环境为:dev-c++,保存为.c文件
十字链表的方式实现在头部插入图中节点,布布扣,bubuko.com