1 #include<stdio.h>
2 #include<stdlib.h>
3 #define OK 1
4 #define NO 0
5 #define TRUE 1
6 #define FALSE 0
7 #define ERROR -1
8 #define MAX_VERTEX_NUM 20 //最大顶点个数
9 typedef int Status;
10
11 typedef struct ArcBox
12 {
13 int tailvex,headvex; //该弧的头结点和尾结点 尾--->头
14 struct ArcBox *hlink,*tlink;//分别指向具有相同弧头和相同弧尾的链域
15
16 }ArcBox;
17
18 typedef char VertexType_OL;//有向图的顶点类型
19 typedef struct VexNode
20 {
21 VertexType_OL data;
22 ArcBox *firstin,*firstout;//指向第一条入弧和出弧
23
24 }VexNode;
25
26 typedef struct
27 {
28 VexNode xlist[MAX_VERTEX_NUM+1];//表头向量
29 int vexnum,arcnum;
30 }OLGraph;
31
32 Status CreateDG_OL(OLGraph *G);
33
34
35 int LocateVex_AL(OLGraph G,VertexType_OL u);
36
37 void OutputOLGraph(OLGraph G);
38
39 int main(int argc,char**argv)
40 {
41 OLGraph G;
42 printf("1\n函数CreateDG_OL等测试..\n");
43 {
44 printf("初始化有向图G..\n");
45 CreateDG_OL(&G);
46 printf("\n");
47
48 }
49 printf("15\n函数OutputOLGraph 测试..\n");
50 {
51 printf("输出有向图的十字链表 G=\n");
52 OutputOLGraph(G);
53 printf("\n");
54 }
55
56
57
58
59 return 0;
60 }
61
62 Status CreateDG_OL(OLGraph *G){
63 int i,j,k;
64 VertexType_OL v1,v2;
65 ArcBox *p;
66 printf("输入顶点数 ");
67 scanf("%d",&(G->vexnum));
68 printf("输入弧数 ");
69 scanf("%d",&(G->arcnum));
70 printf("输入各个顶点值 ");
71 getchar();
72 for(i=1;i<=G->vexnum;i++)
73 {
74 scanf("%c",&(G->xlist[i].data));
75 G->xlist[i].firstin=NULL;
76 G->xlist[i].firstout=NULL;
77 }
78
79 printf("读取各边,构造十字链表\n");
80 for(k=1;k<=G->arcnum;k++)
81 {
82 getchar();
83 printf("输入相邻结点(添加弧的信息)");
84 scanf("%c%c",&v1,&v2);
85 i=LocateVex_AL(*G,v1); //第i个结点的链表相连
86 j=LocateVex_AL(*G,v2);
87 p=(ArcBox*)malloc(sizeof(ArcBox));
88 if(!p)
89 exit(ERROR);
90 p->tailvex=i;
91 p->headvex=j;
92 p->hlink=G->xlist[j].firstin;//把p插到第一个结点中去
93 G->xlist[j].firstin=p;
94
95 p->tlink=G->xlist[i].firstout;
96 G->xlist[i].firstout=p;
97
98 }
99
100 return OK;
101
102
103
104 }
105
106
107 int LocateVex_AL(OLGraph G,VertexType_OL u)
108 {
109 int i;
110 for(i=1;i<=G.vexnum;i++)
111 {
112 if(G.xlist[i].data==u)
113 return i;
114 }
115 return 0;
116
117 }
118
119 void OutputOLGraph(OLGraph G){
120 int i,j;
121 ArcBox *p;
122 if(!G.arcnum&&!G.vexnum)
123 printf("空图!!\n");
124 else
125 {
126 for(i=1;i<=G.vexnum;i++)
127 {
128 printf("%c-> ",G.xlist[i].data);
129 p=G.xlist[i].firstout;
130 j=1;
131 while(p)
132 {
133 while(p->headvex!=j) //已经确定尾部都是i因此找到所有的头部存在的弧就好,另一端弧的head从小到大,因为输入的时候就是从大到小
134 {
135 printf(" ");
136 j++;
137 }
138 printf("(%c,%c)",G.xlist[p->tailvex].data,G.xlist[p->headvex].data);
139 p=p->tlink;
140 j++;
141
142 }
143 printf("\n");
144
145 }
146
147
148
149 }
150
151
152
153 }
![](https://images2017.cnblogs.com/blog/1256227/201710/1256227-20171025220310457-1736327689.png)