#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
/*边表的数据结构*/
typedef struct ArcBox{
int tailvex,headvex;//该弧的尾和顶点的位置
struct ArcBox *hlink,*tlink;//分别为弧头和弧尾相同的弧的链域
}ArcBox;
/*顶点结点的数据结构*/
typedef struct VexNode{
char data;
ArcBox *firstin,*firstout;//分别指向该顶点第一条入弧和出弧
}VexNode;
/*十字链表的数据结构*/
typedef struct{
VexNode xlist[MAX_VERTEX_NUM];//表头向量
int vexnum,arcnum;//有向图的当前结点数和边数
}OLGraph;
/*查找顶点所在的位置*/
int locateVex(OLGraph G,char v)
{
int i=0;
for(i=0;i<G.vexnum;i++)
{
if(G.xlist[i].data==v)
return i;
}
return -1;
}
/*创建十字链表*/
void CreateOLG(OLGraph &G)
{
printf("请输入当前图的顶点总个数和总边数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
setbuf(stdin,NULL);
int i=0;
printf("请输入顶点的数据:\n");
for(i=0;i<G.vexnum;i++)
{
scanf("%c",&G.xlist[i].data);
getchar();
G.xlist[i].firstin=NULL;
G.xlist[i].firstout=NULL;//初始化顶点
}
setbuf(stdin,NULL);
printf("请输顶点之间边的关系:\n");
int k=0;
int j=0;
char v1;
char v2;
for(k=0;k<G.arcnum;k++){
scanf("%c,%c",&v1,&v2);
setbuf(stdin,NULL);
i=locateVex(G,v1);
j=locateVex(G,v2);
ArcBox *p1=(ArcBox *)malloc(sizeof(ArcBox)); //针对输出的firstout域
p1->headvex=j;
p1->tailvex=i;
p1->hlink=NULL;
p1->tlink=NULL;//将边关系存储在*p1指针里面
p1->tlink=G.xlist[i].firstout;
G.xlist[i].firstout=p1;
p1->hlink=G.xlist[j].firstin;//针对输入的firstin域
G.xlist[j].firstin=p1;
}
}
int main()
{
OLGraph G;
CreateOLG(G);
printf("邻接表打印:\n");
int i=0;
ArcBox *p=(ArcBox *)malloc(sizeof(ArcBox));
for(i=0;i<G.vexnum;i++){
printf("%c",G.xlist[i].data);
p->tlink=G.xlist[i].firstout;
while(p->tlink!=NULL){
printf("->%c",G.xlist[p->tlink->headvex].data);
p->tlink=p->tlink->tlink;
}
printf("\n");
}
printf("打印逆邻接表:\n");
for(i=0;i<G.vexnum;i++){
printf("%c",G.xlist[i].data);
p->hlink=G.xlist[i].firstin;
while(p->hlink!=NULL){
printf("->%c",G.xlist[p->hlink->tailvex].data);
p->hlink=p->hlink->hlink;
}
printf("\n");
}
return 0;
}
测试数据:
有错的话,欢迎留言。。。。