1. 存储结构
# ifndef MaxVertexNum
# define MaxVertexNum 10
# endif
# ifndef MaxInt
# define MaxInt 0
# endif
typedef char VertexType;
typedef int EdgeType;
typedef struct ArcNode {
int adjvex;
struct ArcNode * nextarc;
EdgeType weight;
} ArcNode;
typedef struct {
VertexType data;
ArcNode* firstarc;
} AdjList[ MaxVertexNum] ;
typedef struct {
AdjList vertices;
int vexnum;
int arcnum;
} ALGraph;
2. 创建有向/无向图
bool CreateALG ( ALGraph & G, bool tag= false) {
printf ( "请输入总顶点数,总边数:" ) ;
scanf ( "%d %d" , & G. vexnum, & G. arcnum) ;
if ( G. vexnum > MaxVertexNum) {
G. vexnum = G. arcnum = 0 ;
printf ( "创建图失败(最大%d个顶点)!\n" , MaxVertexNum) ;
return false;
}
for ( int i = 0 ; i < G. vexnum; i++ ) {
printf ( "请输入第%d个顶点的名称:" , i + 1 ) ;
getchar ( ) ;
scanf ( "%c" , & G. vertices[ i] . data) ;
G. vertices[ i] . firstarc = NULL ;
}
printf ( "该图的顶点集创建完成!\n" ) ;
for ( int i = 1 ; i <= G. arcnum; i++ ) {
VertexType v1, v2;
EdgeType weight;
printf ( "请依次输入第%d条边依附的顶点及权值:" , i) ;
getchar ( ) ;
scanf ( "%c %c %d" , & v1, & v2, & weight) ;
int index1 = LocateVex ( G, v1) ;
int index2 = LocateVex ( G, v2) ;
if ( index1 >= 0 && index2 >= 0 ) {
if ( ! tag) {
ArcNode* p1 = ( ArcNode* ) malloc ( sizeof ( ArcNode) ) ;
if ( ! p1) {
G. vexnum = G. arcnum = 0 ;
return false;
}
p1-> adjvex = index2;
p1-> weight = weight;
p1-> nextarc = G. vertices[ index1] . firstarc;
G. vertices[ index1] . firstarc = p1;
ArcNode* p2 = ( ArcNode* ) malloc ( sizeof ( ArcNode) ) ;
if ( ! p2) {
G. vexnum = G. arcnum = 0 ;
return false;
}
p2-> adjvex = index1;
p2-> weight = weight;
p2-> nextarc = G. vertices[ index2] . firstarc;
G. vertices[ index2] . firstarc = p2;
}
else {
ArcNode* p = ( ArcNode* ) malloc ( sizeof ( ArcNode) ) ;
if ( ! p) {
G. vexnum = G. arcnum = 0 ;
return false;
}
p-> adjvex = index2;
p-> weight = weight;
p-> nextarc = G. vertices[ index1] . firstarc;
G. vertices[ index1] . firstarc = p;
}
}
else {
G. vexnum = G. arcnum = 0 ;
printf ( "创建图失败(顶点不存在)!\n" ) ;
return false;
}
}
printf ( "边集创建完成!\n" ) ;
printf ( "该图创建完成!\n" ) ;
return true;
}
3. 输出图
void PrintALG ( ALGraph G) {
ArcNode* p = NULL ;
for ( int i = 0 ; i < G. vexnum; i++ ) {
printf ( "%c:" , G. vertices[ i] . data) ;
p = G. vertices[ i] . firstarc;
while ( p) {
printf ( "->%c[%d]" , G. vertices[ p-> adjvex] . data, p-> weight) ;
p = p-> nextarc;
}
printf ( "\n" ) ;
}
}
4. 验证代码
# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
# include <stdlib.h>
int main ( )
{
ALGraph G;
CreateALG ( G) ;
PrintALG ( G) ;
return 0 ;
}