#include <stdio.h>
#include <stdlib.h>
#define MAX 20
typedef int Vextype;
typedef struct Vnode{
Vextype data;
struct Vnode *next;
}Vnode;//顶点的结点结构
typedef Vnode Lgraph[MAX];//一维数组类型标识符
//定义队列
typedef struct{
int V[MAX];
int front;
int rear;
}Queue;
//函数声明
void creat_L(Lgraph G);
void output_L(Lgraph G);
void dfsL(Lgraph G,int v);
void bfsL(Lgraph G,int v);
Lgraph Ga;//是邻接表的表头数组名
int n,e,visited[MAX];
int main()
{
int v1,i;
for(i=0;i<MAX;i++)
visited[i]=0;
creat_L(Ga);//建立无向图的临接表
output_L(Ga);
printf("\n请输入深度优先遍历的出发点:");
scanf("%d",&v1);
printf("\n深度优先遍历的结果为:");
dfsL(Ga,v1);//从v1开始,对图进行深度优先遍历
for(i=0;i<MAX;i++)
visited[i]=0;
printf("\n请输入广度优先遍历的出发点:");
scanf("%d",&v1);
printf("\n广度优先遍历的结果:");
bfsL(Ga,v1);
return 0;
}
//建立无向图的邻接表
void creat_L(Lgraph G)
{
Vnode *p,*q;
int i,j,k;
printf("\n请输入图的顶点数和边数:");
scanf("%d,%d",&n,&e);
for(i=1;i<=n;i++){G[i].data=i;G[i].next=NULL;}
for(k=1;k<=e;k++)
{
printf("请输入每条边的关联顶点编号:");
scanf("%d,%d",&i,&j);
p=(Vnode*)malloc(sizeof(Vnode));
p->data=i;
p->next=G[j].next;G[j].next=p;//p结点链接到第j链
q=(Vnode*)malloc(sizeof(Vnode));
q->data=j;
q->next=G[i].next;G[i].next=q;
}
}
//l邻接表的输出
void output_L(Lgraph G)
{
int i;
Vnode *p;
for(i=1;i<=n;i++)
{
printf("\n与[%d]关联的顶点有:",i);
p=G[i].next;
while(p!=NULL){printf("%5d",p->data);p=p->next;}
}
}
//初始化队列
void initqueue(Queue *q)
{
q->front=-1;
q->rear=-1;
}
//判断队列是否为空
int quempty(Queue *q)
{
if(q->front==q->rear)
{
return 1;
}
else
{
return 0;
}
}
//入队操作
void enqueue(Queue *q,int e)
{
if((q->rear+1)%MAX==q->front)
printf("队列满!\n");
else
{
q->rear=(q->rear+1)%MAX;
q->V[q->rear]=e;
}
}
//出队操作
int dequeue(Queue *q)
{
int t;
if(q->front==q->rear)
{
printf("队列空、\n");return 0;
}
else
{
q->front=(q->front+1)%MAX;
t=q->V[q->front];
return t;
}
}
//s深度优先遍历
void dfsL(Lgraph G,int v)
{
Vnode *p;
printf("%d->",G[v].data);
visited[v]=1;//顶点v被访问,标志1
p=G[v].next;
while(p){v=p->data;
if(visited[v]==0) dfsL(G,v);
p=p->next;}
}
//广度
void bfsL(Lgraph g,int v)
{
int x;
Vnode *p;
Queue *q=(Queue*)malloc(sizeof(Queue));
initqueue(q);
printf("\n%d->",g[v].data);
visited[v]=1;
enqueue(q,v);
while(!quempty(q))
{
x=dequeue(q);
p=g[x].next;
while(p){
v=p->data;
if(visited[v]==0)
{printf("%d->",g[v].data);
visited[v]=1;
enqueue(q,v);
}
p=p->next;
}
printf("\n");
}
}
建立图的邻接表储存并实现深度优先和广度优先遍历
原文作者:数据结构之图
原文地址: https://blog.csdn.net/larry_794204525/article/details/49184525
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/larry_794204525/article/details/49184525
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。