本文针对图的邻接表存储。
邻接表示图的链式存储方式。有几个顶点就有几个链表,每个链表的后边的节点表示与顶点有关的边。如下图:
左边都是顶点,右边都是边。
在本文程序里没有包含边的附件信息。
程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
typedef int status;
#define MAX_NAME 5 //顶点字符串的最大长度 + 1
typedef char VertexType[MAX_NAME];
#define MAX_VERTEX_NUM 20
typedef enum {DG,DN,UDG,AN} GraphKind; //{有向图,有向网,无向图,无向网}
int visited[MAX_VERTEX_NUM];
void(*VisitFunc)(char* v); /* 函数变量(全局量) */
typedef struct ArcNode //没有相关信息
{
int adjvex; //所指向的顶点的下标
int *info; //网权值
struct ArcNode *nextarc;
}ArcNode; //边结点
typedef struct
{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM]; //头结点
typedef struct
{
AdjList vertexs;
int vexnum,arcnum; //图当前顶点数和弧数
int kind;
}Graph; //图
//返回顶点在图中位置
int locate_vertex(Graph *G,VertexType u)
{
int i;
for(i = 0;i < G->vexnum;++i)
if(strcmp(u,G->vertexs[i].data) == 0)
return i;
return -1;
}
//创建图
status CreateGraph(Graph *G)
{
int i,j,k;
int w;
VertexType va,vb;
ArcNode *p;
printf("please input the type of graph(directed graph:0 directed net:1 undirected graph:2 undirected net:3): ");
scanf("%d",&G->kind);
printf("please input the vertex number, edge number: ");
scanf("%d %d",&G->vexnum,&G->arcnum);
printf("please input %d string of vertex value(<%d chars of each string):\n",G->vexnum,MAX_NAME);
for(i = 0;i < G->vexnum;++i){
scanf("%s",G->