/*
* 从顶点V出发进行深度优先搜索。
* 函数DFS应从编号为V的顶点出发递归地深度优先遍历图,
* 遍历访问邻接点时,要求按序号递增的顺序。
* 题目保证V是图中的合法顶点。
* 参数G为邻接矩阵存储的图的表示。
*/
void DFS(MatGraph * G, VertexType V) {
/**
* 请在下面的begin..end间编写程序代码,
* 勿修改begin..end之外的代码。
*/
/*******************begin*******************/
visited[V] = 1; //将顶点 V 的访问标志置为 1
printf(" %d",V);
for (int j = 0; j < G->n; j++) //对其他所有顶点 j
{
//j 是 i 的邻接顶点,且顶点 j 没有访问过
if (G->edges[V][j] == 1 && !visited[j]) {
//递归搜索前的准备工作需要在这里写代码
DFS(G,j); //从顶点 j 出发进行 DFS 搜索
//以下是 DFS 的回退位置,在很多应用中需要在这里写代码
}
}
/*******************end********************/
}
两个都是期末考试题
#include "graph.h"
#include <stdio.h>
#include <stdlib.h>
void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e) //创建图的邻接表
{
int i,j;
ArcNode *p;
G=(AdjGraph *)malloc(sizeof(AdjGraph));
for(i=0;i<n;i++) //给邻接表的头元素的指针域置初值
{
G->adjlist[i].firstarc=NULL;
}
for(i=0;i<n;i++) //检查邻接表的每个元素
{
for(j=n-1;j>=0;j--)
{
if(A[i][j]!=0&&A[i][j]!=INF) //存在一条边
{
p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点p
p->adjvex=j; //存放邻接点
p->weight=A[i][j]; //存放权
p->nextarc=G->adjlist[i].firstarc; //采用头插法插入结点p
G->adjlist[i].firstarc=p;
}
}
}
G->n=n;
G->e=e;
}
void DispAdj(AdjGraph *G)
{
int i;
ArcNode *p;
for(i=0;i<G->n;i++)
{
p=G->adjlist[i].firstarc;
printf("%3d: ",i);
while(p!=NULL)
{
printf("%d[%d]→",p->adjvex,p->weight);
p=p->nextarc;
}
printf("^\n");
}
}
void DestroyAdj(AdjGraph *&G)
{
int i;
ArcNode *pre,*p;
for(i=0;i<G->n;i++) //扫描所有单链表
{
pre=G->adjlist[i].firstarc; //p指向第i个单链表的头结点
if(pre!=NULL)
{
p=pre->nextarc;
while(p!=NULL) //释放第i个单链表的所有结点
{
free(pre);
pre=p;
p=p->nextarc;
}
free(pre);
}
}
free(G);
}
//深度优先遍历
int visited[MAXV]; //全局数组,记录访问的点
void DFS(AdjGraph *G,int v)
{
/********** Begin **********/
ArcNode *p;
visited[v]=1;
printf("%3d",v);
p=G->adjlist[v].firstarc;
while(p!=NULL){
if(visited[p->adjvex]==0)
DFS(G,p->adjvex);
p=p->nextarc;
}
/********** End **********/
}