源代码:
//
// graph.c
// 程序目的:有向图的十字链表存储
// Created by zhen7216 on 2016/12/11.
// Copyright © 2016年 chenzhen. All rights reserved.
//
#include <stdio.h>
#define MaxNum 50 //图的最大顶点数为50
typedef struct arcnode { //定义弧结点类型,假设不考虑权值
int tailvex, headvex; //弧尾顶点和弧头顶点的位置
struct arcnode *hlink, *tlink; //指向相同弧头和弧尾的其他弧
} arcNode;
typedef struct vexnode { //定义顶点结点类型
char vertex[3];
arcNode *firstin, *firstout; //分别指向该顶点第一条入弧和出弧
} vexNode;
typedef struct { //定义十字链表存储的图类型
vexNode vlist[MaxNum];
int vexnum, arcnum;
} olGraph;
int Locate(olGraph *G, char vex[]) { //确定顶点在图中的位置
int i;
for(i = 0; i < G->vexnum; i++)
if(strcmp(G->vlist[i].vertex, vex) == 0)
return i;
return 0;
}
void createOlg(olGraph *G) { //采用十字链表,构造有向图G
int i, j, k;
char vex1[3], vex2[3];
arcNode *s;
printf("\n输入有向图的顶点数和弧数(用逗号隔开):");
scanf("%d,%d", &(G->vexnum), &(G->arcnum));
printf("输入顶点信息(不超过2个字符):\n");
for(i = 0; i < G->vexnum; i++) { //建立顶点表
scanf("\n%s", G->vlist[i].vertex);
G->vlist[i].firstin = G->vlist[i].firstout = NULL;
}
for(k = 0; k < G->arcnum; k++) { //输入e条弧,构造十字链表
printf("\n输入第%d条边的第1个顶点:", k + 1);
scanf("%s", vex1);
printf("\n输入第%d条边的第2个顶点:", k + 1);
scanf("%s", vex2);
i = Locate(G, vex1);
j = Locate(G, vex2);
s = (arcNode*)malloc(sizeof(arcNode)); //生成新的弧结点
s->tailvex = i;
s->headvex = j;
s->hlink = G->vlist[j].firstin;
s->tlink = G->vlist[i].firstout;
G->vlist[j].firstin = G->vlist[i].firstout = s;
}
}
void printGraph(olGraph *G) { //打印图的顶点和边的信息
int i;
arcNode *s;
printf("\n图中顶点的个数为:%d", G->vexnum);
printf("\n图中顶点的边数为:%d", G->arcnum);
printf("\n图中顶点为:");
for(i = 0; i < G->vexnum; i++)
printf("%s", G->vlist[i].vertex);
printf("\n图中顶点的邻接点为:");
for(i = 0; i < G->vexnum; i++) {
printf("\n%s:", G->vlist[i].vertex);
s = G->vlist[i].firstout;
while(s) {
printf("%s", G->vlist[s->headvex].vertex);
s = s->tlink;
}
}
printf("\n图中顶点的逆邻接顶点为:");
for(i = 0; i < G->vexnum; i++) {
printf("\n%s:", G->vlist[i].vertex);
s = G->vlist[i].firstin;
while(s) {
printf("%s", G->vlist[s->tailvex].vertex);
s = s->hlink;
}
}
}
int main() {
olGraph olg;
createOlg(&olg);
printGraph(&olg);
return 0;
}
运行结果: