#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 10//最大顶点个数
typedef char VertexType;//也可以写成#define VertexType char
//定义边
typedef struct Edge
{
int dest;//顶点下标
struct Edge* link;//链接下一条边
}Edge;
//定义顶点结构体
typedef struct Vertex
{
VertexType data;
Edge* adj;//指向边的指针
}Vertex;
//定义图的存储结构
typedef struct GraphLink
{
int vernum, arcnum;//顶点个数和边的个数
Vertex* NodeTable;
}GraphLink;
//寻找顶点v的位置序号
int GetVertexPos(GraphLink* G, VertexType v)
{
int i = 0;
for (;i < G->vernum;i++)
{
if (G->NodeTable[i].data == v)
return i;
}
return -1;
}
//初始化
void InitGraph(GraphLink* G)
{
int i;
G->vernum = G->arcnum = 0;
G->NodeTable = (Vertex*)malloc(sizeof(Vertex) * MAX_VERTEX_NUM);
for (i = 0;i < MAX_VERTEX_NUM;i++)
{
G->NodeTable[i].adj = NULL;
}
}
//向图中插入顶点
void InsertVertex(GraphLink* G, VertexType vertex)
{
if (MAX_VERTEX_NUM <= G->vernum)
return;
G->NodeTable[G->vernum++].data = vertex;
}
//打印图
void ShowGraph(GraphLink* G)
{
Edge* p;
int i;
for (i = 0;i < G->vernum;i++)
{
printf("%d%c:>",i, G->NodeTable[i].data);
p = G->NodeTable[i].adj;
while (p != NULL)
{
printf("%d-->", p->dest);
p = p->link;
}
printf("NULL\n");
}
printf("\n");
}
//采用头插法的方式插入边
void InsertEdge(GraphLink* G, VertexType vertex1, VertexType vertex2)
{
int v1 = GetVertexPos(G, vertex1);
int v2 = GetVertexPos(G, vertex2);
if (v1 == -1 || v2 == -1)//如果v1,v2中有一个不存在
return;
Edge* s;
//v1-->v2插入一条边
s = (Edge*)malloc(sizeof(Edge));
s->dest = v2;
s->link = G->NodeTable[v1].adj;
G->NodeTable[v1].adj = s;
//v2-->v1插入一条边
s = (Edge*)malloc(sizeof(Edge));
s->dest = v1;
s->link = G->NodeTable[v2].adj;
G->NodeTable[v2].adj = s;
G->arcnum++;//边数增加一条
}
int main()
{
GraphLink G;
InitGraph(&G);//初始化
//向图中插入顶点
InsertVertex(&G, 'A');
InsertVertex(&G, 'B');
InsertVertex(&G, 'C');
InsertVertex(&G, 'D');
InsertVertex(&G, 'E');
//向图中插入边
InsertEdge(&G, 'A', 'B');
InsertEdge(&G, 'A', 'D');
InsertEdge(&G, 'B', 'C');
InsertEdge(&G, 'B', 'E');
InsertEdge(&G, 'C', 'D');
InsertEdge(&G, 'C', 'E');
//打印图
ShowGraph(&G);
return 0;
}