编程实现建立一个无向图,然后对此图进行深度优先遍历和广度优先遍历。

#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100
#define INF 0x3f3f3f3f
typedef char VertexType[10];
typedef struct edgenode
{
int adjvex;
int weight;
struct edgenode * nextarc;
} ArcNode;
typedef struct vexnode
{
VertexType data;
ArcNode * firstarc;
}VHeadNode;
typedef struct
{
int n,e;
VHeadNode adjlist[MAXVEX];
}AdjGraph;
void CreateGraph(AdjGraph * &G,int A[][MAXVEX],int n,int e)//创立
{
int i,j;
ArcNode * p;
G=(AdjGraph *)malloc(sizeof(AdjGraph));
G->n=n;G->e=e;
for(i=0;i<G->n;i++)
 G->adjlist[i].firstarc=NULL;
for(i=0;i<G->n;i++)
 for(j=G->n-1;j>=0;j--)
     if(A[i][j]>0&&A[i][j]<INF)
     {
     p=(ArcNode *)malloc(sizeof(ArcNode));
     p->adjvex=j;
     p->weight=A[i][j];
     p->nextarc=G->adjlist[i].firstarc;
     G->adjlist[i].firstarc=p;
     }
}
void DestroyGraph(AdjGraph *&G)//销毁
{
int i;
ArcNode *pre,*p;
for(i=0;i<G->n;i++)
{
pre=G->adjlist[i].firstarc;
if(pre!=NULL){
p=pre->nextarc;
while (p!=NULL)
{
free(pre);
pre=p;p=p->nextarc;
}
free(pre);
}
}
free(G);
}
void DispGraph(AdjGraph *G)//输出图
{
ArcNode *p;
int i;
for(i=0;i<G->n;i++)
{
printf("[%2d]",i);
p=G->adjlist[i].firstarc;
if(p!=NULL)
printf("->");
while(p!=NULL){
printf("%d(%d)",p->adjvex,p->weight);
p=p->nextarc;
}
printf("\n");
}    
}
int visited[MAXVEX]={0};        //全局变量
void DFS(AdjGraph *G,int v)
{  int w; ArcNode *p;
   printf("%d ",v);        //访问v顶点
   visited[v]=1;
   p=G->adjlist[v].firstarc;    //找v的第一个相邻点
   while (p!=NULL)        //找v的所有相邻点
   {    w= p->adjvex;        //顶点v的相邻点w
    if (visited[w]==0)    //顶点w未访问过
    DFS(G,w);        //从w出发深度优先遍历
    p=p->nextarc;        //找v的下一个相邻点
   }
}
void BFS(AdjGraph *G,int vi) 
{ int i,v,visited[MAXVEX]; ArcNode *p;
   int Qu[MAXVEX],front=0,rear=0;    //定义一个循环队列Qu
   for (i=0;i<G->n;i++) visited[i]=0;    //visited数组置初值0
   printf("%d ",vi);            //访问初始顶点
   visited[vi]=1;
   rear=(rear+1)%MAXVEX; Qu[rear]=vi;    //初始顶点进队
   while (front!=rear)            //队不为空时循环
   {  front=(front+1) % MAXVEX;
      v=Qu[front];            //出队顶点v
      p=G->adjlist[v].firstarc;    //查找v的第一个相邻点
      while (p!=NULL)            //查找v的所有相邻点
      {  if (visited[p->adjvex]==0)    //未访问过则访问之
         {  printf("%d ",p->adjvex);    //访问该点并进队
            visited[p->adjvex]=1;
            rear=(rear+1) % MAXVEX;
            Qu[rear]=p->adjvex;
         }
         p=p->nextarc;            //查找v的下一个相邻点
      }
   }
}

void main(){
AdjGraph *G;
int n=5,e=5,i;
int A[MAXVEX][MAXVEX]={{0,1,1,0,0},{1,0,1,1,0},{1,1,0,0,1},{0,1,0,0,0},{0,0,1,0,0}};
CreateGraph(G,A,n,e);
printf("图G的存储结构:\n");DispGraph(G);
printf("DFS:");DFS(G,0);printf("\n");
printf("BFS:");BFS(G,0);printf("\n");
DestroyGraph(G);

}

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柒月初一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值