1.首先是变量声明和定义
#define OK 1
#define ERROR -1
#define MAX_VERTEX_NUM 20 //顶点个数最大值为20
#define INFINITY INT_MAX //权值的最大值∞
typedef int Status;
typedef char VexType;
2.图的存储结构初始化
/* ------------ 边结点 -------------*/
typedef struct ArcNode
{
struct ArcNode *nextarc; //指向下一条边的指针
int adjvex; //该边所连接的顶点的位置
}ArcNode;
/* ------------ 顶点结点 -------------*/
typedef struct
{
ArcNode *firstarc; //该顶点指向的第一条边
VexType data; //顶点的数据
}VNode,AdjList[MAX_VERTEX_NUM]; //邻接表的顶点使用一维数组
/* ------------ 邻接表图的存储结构 -------------*/
typedef struct
{
AdjList vertices; //图的顶点
int vexnum, arcnum; //图的顶点数和弧数
}ALGraph;
3.在构造好图的邻接表存储结构后,便可以对有向图(网)和无向图(网)的算法
邻接表无向图的构建方法:
1.输入顶点数和边数
2.建立定点表。
依次输入顶点的信息存入顶点表中,
使每个表头结点的指针域初始化为NULL
3.创建邻接表。
依次输入每条边依附的两个顶点
确定两个顶点的序号i和j,建立边结点
将此边结点分别插入到vi和vj对应的两个边链表的头部(使用链表的头插法)
/*---------------无向图的构造,用邻接表表示------------*/
Status CreateUDG(ALGraph &G)
{
printf("请输入顶点数目:");
scanf("%d", &G.vexnum);
printf("请输入弧的数目:");
scanf("%d", &G.arcnum);
int i,j,k;
VexType v1, v2;
for (i = 0; i < G.vexnum; i++) //输入各点,构造表头结点表
{
getchar();
printf("正在创建顶点表,请输入顶点信息:\n");
scanf("%c", &G.vertices[i].data); //输入顶点值
G.vertices[i].firstarc = NULL; //初始化表头结点的指针域
}
for (k = 0; k < G.arcnum; k++)
{
getchar();
printf("正在连接各个顶点,请输入弧的信息:\n");
printf("请输入这条边所依附的一个顶点: ");
scanf("%c",&v1);
getchar();
printf("请输入该边的另一个顶点: ");
scanf("%c",&v2);
printf("\n");
i = Locate(G, v1); //求顶点v1在顶点表中的编号
j = Locate(G, v2); //求顶点v2在顶点表中的编号
//采用头插法建表
ArcNode *p1,*p2; //使用指向边结点的指针p来进行链表连接
p1 =new ArcNode; //p1是从v1结点到v2的弧
p1->adjvex = j;
p1->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p1; //将新结点*p1插入到顶点vi的边表头部
p2 =new ArcNode; //p2是从v2结点到v1的弧
p2->adjvex = i;
p2->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = p2; //将新结点*p2插入到顶点vj的边表头部
}
return OK;
}
若构建有向图,则只需要构建出度边的邻接表即可,即只需建立以vi为弧尾的边的结点
4.使用递归法实现深度遍历DFS
/*----------深度遍历判断两顶点间是否存在边-----------*/
void DFS(ALGraph G, int i, int j,bool &found)
{
ArcNode *p;
visited[i] = true;
if (i == j)
found = true;
else
{
p = G.vertices[i].firstarc;
while(!found && p != NULL)
{
if(!visited[p->adjvex])
DFS(G, p->adjvex, j, found);
p = p->nextarc;
}
}
}