#include<stdio.h>
#include<stdlib.h>
//把临接表的存储结构定义和各个函数定义放到这里
#define MaxSize 10 //图的最大顶点数
int visited [MaxSize]={ 0 }; //visited变量,来表示节点i是否已经被访问过
typedef char DataType; //定义图中顶点的数据类型 假设为char型
typedef struct EdgeNode //定义边表节点
{
int adjvex;
struct EdgeNode *next;
}EdgeNode;
typedef struct //定义顶点表节点
{
DataType vertex;
EdgeNode *first;
} VertexNode;
typedef struct //定义临接表存储结构
{
VertexNode adjlist[MaxSize]; //存放顶点的数组
int vertexNum,edgeNum; //图的定点数和边数
}ALGraph;
//创建临接表
void CreatGraph(ALGraph *G,DataType a[],int n,int e)
{
int i,j,k;
EdgeNode *p1 = NULL;
EdgeNode *p2 = NULL;
G->vertexNum = n; G->edgeNum = e;
//初始化顶点表
for (i=0; i<G->vertexNum;i++)
{
G->adjlist[i].vertex=a[i];// 存储顶点信息
G->adjlist[i].first = NULL;//初始化边表的头指针
}
for (k=0;k<G->edgeNum;k++)
{
printf("输入边所依附的顶点数组下标:\n");
scanf_s("%d%d",&i,&j); //输入边所依附的顶点编号
p1 = (EdgeNode *)malloc(sizeof(EdgeNode));
p1->adjvex = j;
p1->next = G->adjlist[i].first; //将p1插入到第i个边表的表头
G->adjlist[i].first = p1;
//生成另一个对称的新的边节点*p2,插入在vj边表的头部
p2 = (EdgeNode *)malloc(sizeof(EdgeNode));
p2->adjvex = i;//邻接点序号为i
p2->next = G->adjlist[j].first;
G->adjlist[j].first=p2;//将新节点*p2插入顶点vj的边表头部
}
}
//深度优先搜索
void DFS(ALGraph *G, int v)
{
EdgeNode *p = NULL;
int j;
printf("%c",G->adjlist[v].vertex);visited[v]=1;
p=G->adjlist[v].first;//工作指针p指向顶点v的边表
while (p != NULL) //依次搜索顶点v的临接点j
{
j=p->adjvex;
if(visited[j]==0)DFS(G,j);
p=p->next;
}
}
int main()
{
char ch[] = {'A','B','C','D','E'};//图的五个顶点只分别是ABCDE
int i;
ALGraph ALG;
printf("图的五个顶点值分别是A,B,C,D,E数组下标分别是 1,2,3,4");
CreatGraph(&ALG,ch,5,6);//建立具有5个顶点6条边的有向图
for (i=0;i<MaxSize;i++)
visited[i]=0;
printf("深度优先遍历序列是:");
DFS(&ALG,0);//从顶点0出发进行的深度优先遍历
printf("\n");
getchar();
return 0;
}