#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MaxSize 100
typedef struct EageTable //边表
{
int eageData; //值
struct EageTable *next; //指向下一条弧
}EageTable;
typedef struct HeadTable //头表
{
int headData; //值
EageTable *first; //指向头节点后第一个节点
}HeadTable,HeadList[MaxSize];
typedef struct{
HeadList Graph;
int headNum,arcNum; //头节点书 弧数
}Graph;
bool vis[MaxSize] = {false};
void InitGraph(Graph *G);
void CreateGraph(Graph *G,int flag,int a,int b);
void DFS(Graph *G,int front);
void TraverDFS(Graph *G);
/*初始化邻接表的头*/
void InitGraph(Graph *G)
{
int i;
for(i = 1;i <= G->headNum;i++)
{
G->Graph[i].headData = i;
G->Graph[i].first = NULL;
}
}
/*创建邻接表*/
void CreateGraph(Graph *G,int flag,int a,int b)
{
EageTable* eage;
eage = (EageTable*)malloc(sizeof(EageTable));
eage->eageData = b;
//头插入
eage->next = G->Graph[a].first;
G->Graph[a].first = eage;
//图为无向图时
if(flag == 2)
{
EageTable* eagee;
eagee = (EageTable*)malloc(sizeof(EageTable));
eagee->eageData = a;
//头插入
eagee->next = G->Graph[b].first;
G->Graph[b].first = eagee;
}
}
/*深搜*/
void DFS(Graph *G,int front)
{
vis[front] = true;//标志节点已读
printf("%-2d",front);
EageTable *eage = G->Graph[front].first;//eage区front节点的侧表
while (eage)
{
if(!vis[eage->eageData])DFS(G,eage->eageData);
eage = eage->next;
}
}
void TraverDFS(Graph *G)
{
int i;
for(i = 1;i <= G->headNum;i++)
{
if(!vis[i])DFS(G,i);
}
}
int main(int argc, char const *argv[]) {
Graph G;
int i,flag,start;
printf("有向图输入1,无向图输入2:");
scanf("%d",&flag);
printf("请输入节点数:");
scanf("%d",&G.headNum);
InitGraph(&G);
printf("请输入弧的条数(从1开始):");
scanf("%d",&G.arcNum);
printf("请输%d入条边:\n",G.arcNum);
for(i = 0;i < G.arcNum;i++)
{
int a,b;
scanf("%d %d",&a,&b);
CreateGraph(&G,flag,a,b);
}
printf("DFS结果:\n");
TraverDFS(&G);
return 0;
}
王道考研 ++++ 图的深度优先搜索
猜你喜欢
转载自blog.csdn.net/WX_1218639030/article/details/99119993
今日推荐
周排行