bfs算法实例c语言,C语言之图的创建 dfs bfs操作

头文件

typedef struct anode

{

intadjvex;

structanode *next;

}Anode;

typedef struct vnode

{

intvertex;

Anode*first;

}Vnode;

typedef struct

{

Vnodevex[MaxVex];

intvnum;

intednum;

intvisited[MaxVex];

}Lgraph;

typedef struct node queue                                        //添加一个队列结构体,bfs需要

{

Anode *first;

Anode *rear;

}Queue;

#include

#include

//#include

//#include

#include "graph.h"

Lgraph *createGraph()

{

Lgraph *p;

Anode *s;

int i,j,k;

p=(Lgraph*)malloc(sizeof(Lgraph));

printf("请输入顶点和边的个数\n");

scanf("%d%d",&p->vnum,&p->ednum);

printf("请输入顶点的信息\n");

for(i=0;ivnum;i++)

{

scanf("%d",&p->vex[i].vertex);

s=(Anode*)malloc(sizeof(Anode));

p->vex[i].first=s;

s->adjvex=NULL;

s->next=NULL;

}

printf("请输入边的信息\n");

for(k=0;kednum;k++)

{

scanf("%d%d",&i,&j);

s=(Anode*)malloc(sizeof(Anode));

s->adjvex=j;

s->next=p->vex[i].first->next;

p->vex[i].first->next=s;

s=(Anode*)malloc(sizeof(Anode));

s->adjvex=i;

s->next=p->vex[j].first->next;

p->vex[j].first->next=s;

}

return p;

}

void display(Lgraph *p)

{

int i;

Anode *current;

printf("输出图的顶点的信息\n");

for(i=0;ivnum;i++)

{

printf("%d\t",p->vex[i].vertex);

}

printf("输出图的边的信息\n");

for(i=0;ivnum;i++)

{

current=p->vex[i].first->next;

while(current!=NULL)

{

printf("%d",p->vex[i].vertex);

printf("%d\t",current->adjvex);

current=current->next;

}

}

}

Queue *Initiate_queue()                                                                     //初始化队列

{

Queue *Q;

Anode *s;

Q=(Queue*)malloc(sizeof(Queue));

s=(Anode *)malloc(sizeof(Anode));

s->adjvex=NULL;

s->next=NULL;

Q->first=Q->rear=s;

return Q;

}

int De_queue(Queue *q)                                                       //删除队列元素

{

Anode *t;

Anode *p=q->first;

int u;

if(q->first==q->rear)

{

printf("队列为空\n");

}

else

{

t=q->first->next;

q->first->next=t->next;

u=t->adjvex;

free(t);

while(p->next!=NULL)

{

p=p->next;

}

q->rear=p;

}

return u;

}

void En_queue(Queue *q,int source)                              //将source入队列q

{

Anode *s;

s=(Anode*)malloc(sizeof(Anode));

s->adjvex=source;

s->next=NULL;

if(q->first==q->rear)

{

q->first->next=s;

}

else

{

q->rear->next=s;

}

q->rear=s;

}

int Isempty(Queue *q)                                                                //看队列是否为空

{

if(q->first==q->rear)

{

return 0;

}

else

{

return 1;

}

}

void BFS(Lgraph *p,Queue *q,int source)                                   //要完成BFS算法,需要队列中的创建 增加删除操作

{

Anode *current;

int i,u;

int visited[MaxVex];

for(i=0;ivnum;i++)

{

visited[i]=0;                                                        //设置一个标志数组用来bfs

}

printf("The BFSList\n");

printf("%d",p->vex[source].vertex);

visited[source]=1;

En_queue(q,source);

while(Isempty(q))

{

u=De_queue(q);

current=p->vex[u].first->next;

while(current!=NULL)

{

if(visited[current->adjvex]==0)

{

printf("%d",current->adjvex);

visited[current->adjvex]=1;

En_queue(q,current->adjvex);

current=current->next;

}

else

{

current=current->next;

}

}

}

}

void Initvisited(Lgraph *p)                                                                //设置一个存在结构体内的标志数组,结构体内数组可传入函数

{

int i;

for(i=0;ivnum;i++)

{

p->visited[i]=0;                                                                         //为0代表未用过,用过修改为1

}

}

void DFS(Lgraph *p,int source)

{

Anode *current;

printf("%d",p->vex[source].vertex);

p->visited[source]=1;

current=p->vex[source].first->next;

while(current!=NULL)

{

if(p->visited[current->adjvex]==0)

{

DFS(p,current->adjvex);

}

current=current->next;

}

}

void main()

{

Lgraph *G;

Queue *Q;

int s;

G=createGraph();

display(G);

Q=Initiate_queue();

printf("\nPleaseinput the source\n");

scanf("%d",&s);

BFS(G,Q,s);

printf("\nThe DFSlist\n");

Initvisited(G);

DFS(G,s);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值