该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#define MAXNUM 100
#define FALSE 0
#define TRUE 1
int visited[MAXNUM];
typedef char VertexType; //边表结点
typedef struct node
{
int adjvex;
struct node *next;
}EdgeNode; //顶点表结点
typedef struct vnode
{
VertexType vertex;
EdgeNode * firstedge;
}VertexNode;
typedef VertexNode AdjList[MAXNUM];//AdjList是邻接表类型名 //简单的应用无需进行下列类型定义,直接使 用AdjList类型
typedef struct
{
AdjList adjlist;//邻接表
int n,e;//图中当前定点数和变数
//int kind;//图的种类和标志
}ALGraph; //建立无向图的邻接表
void CreateMGraph(ALGraph *G)
{
int i,j,k;
EdgeNode *s;
printf("请输入图的顶点数和边数:\n");
scanf("%d%d",&G->n,&G->e);//读入顶点数和边数
for(i=0;in;i++)//建立顶点表
{
fflush(stdin);
scanf("%c",G->adjlist[i].vertex);//读入定点信息
G->adjlist[i].firstedge=NULL;//边表置为空表
}
for(k=0;ke;k++)//建立边表
{
scanf("%d%d",&i,&j);//读入(vi,vj)的顶点对序号
s=(EdgeNode*)malloc(sizeof(EdgeNode));//生成边表结点
s->adjvex=j;//邻接点序号为j
s->next=G->adjlist[i].firstedge;
G->adjlist[i].firstedge=s;//将新的结点*s插入顶点vi的边表头部
s=(EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex=i;//邻接点序号为i
s->next=G->adjlist[j].firstedge;//将新的结点*s插入顶点vj的边表头部
G->adjlist[j].firstedge=s;
}
} //深度优先遍历邻接表
void DFSTraverse(ALGraph *G)
{
int i;
for(i=0;in;i++)
visited[i]=FALSE;//标志向量初始化
for(i=0;in;i++)
if(!visited[i])//vi未被访问过
DFS(G,i);//以vi为源点开始DFS搜索
} //邻接表深度优先搜索
void DFS(ALGraph *G,int i)
{
EdgeNode *p;
printf("visit vertxt:%c",G->adjlist[i].vertex);//访问顶点vi
visited[i]=TRUE;//标记vi已访问
p=G->adjlist[i].firstedge;//取vi边表的头指针
while(p)
{
if(!visited[p->adjvex])//则vi尚未被访问
DFS(G,p->adjvex);//以vj为出发点向纵深搜索
p=p->next;//找vi的下一邻接点
}
} int main()
{ ALGraph G;
CreateMGraph(&G);
DFSTraverse(&G);
return 0;
}