#include<stdio.h>
#include<malloc.h>
#define Max 50
int visited[Max];
//边表节点
typedef struct EdgeNode
{
int adjvex;//储存对应顶点的下标
int weight;//用于储存权值
struct EdgeNode * p;//指向下一个边表节点
}EdgeNode;
//顶点表节点
typedef struct VertexNode
{
int date;//数据
EdgeNode * p;//指向边表节点
}VertexNode;
//图节点
typedef struct Graph
{
VertexNode agjList[Max];//顶点表数组
int numVextexes,numEdges;//当前顶点数和边数
}Graph;
//创建图的邻接表结构
void GreateGraph(Graph * G)
{
int i,j,k;
EdgeNode * e;
printf("输入顶点数和边数");
scanf("%d %d",&G->numVextexes,&G->numEdges);
for(i=0;i<G->numVextexes;i++)//输入顶点信息
{
printf("输入顶点的信息:");
scanf("%d",&G->agjList[i].date);
G->agjList[i].p=NULL;
}
/*
1>利用头插法
2>因为无向图没有方向,所以创建边表节点的时候,要重复创建两次
并进行相反的操作
*/
for(k=0;k<G->numEdges;k++)//建立边表
{
printf("输入边(Vi,Vj)的下标i和j的值:");
scanf("%d %d",&i,&j);
e=(EdgeNode *)malloc(sizeof(EdgeNode));//动态分配空间来储存边表节点
e->adjvex=j;
e->p=G->agjList[i].p;
G->agjList[i].p=e;
e=(EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex=i;
e->p=G->agjList[j].p;
G->agjList[j].p=e;
}
}
void DFS(Graph G,int i)
{
EdgeNode * p;
visited[i]=1;//表示已经被访问
printf("%d\n",G.agjList[i].date);
p=G.agjList[i].p;
while(p)
{
if(visited[p->adjvex]==0)
{
DFS(G,p->adjvex);
}
p=p->p;
}
}
void DFS_search(Graph G)
{
int i;
//初始化标志为0代表该顶点没有被访问
for(i=0;i<G.numVextexes;i++)
{
visited[i]=0;
}
//判断是否被访问,如果未被访问,就执行深度遍历操作
for(i=0;i<G.numVextexes;i++)
{
if(visited[i]==0)
{
DFS(G,i);
}
}
}
int main()
{
Graph G;
GreateGraph(&G);
DFS_search(G);
return 0;
}
说明:
我在编写代码的时候发现了如果我顶点里面是存放的是char类型的数据的话,代码在执行过程中,会出现错误,我表示很疑问!
我会尽快找出这个问题;