图的深度优先遍历和广度优先遍历

这几天学习了图的存储结构,有用;邻接矩阵和邻接表法两种方式。其中两种表示方法各有相应的用途,在这里仅用邻接表法来表示图,并且讨论图的深度优先遍历和广度优先遍历,下面是代码:

//ArcNode 边结点; VertexNode 表头结点; AdjList 邻接表表示法
//图的邻接表表示法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <queue>
#define Max 101 //最多有100个结点
bool visit[Max];
//===================
typedef int type_queue;  
typedef struct node  
{  
    type_queue x;  
    struct node *next;  
}Node;  
typedef struct  
{  
    Node *front;  
    Node *rear;  
}Queue;  
  
bool Is_empty(Queue *p){  
    if(p->front==NULL && p->rear==NULL)  
        return true;  
    return false;  
}  
void Push(Queue *p,type_queue x){  
    Node *s=(Node*)malloc(sizeof(Node));  
    s->x=x;  
    s->next=NULL;  
    if(Is_empty(p)){  
        p->rear=p->front=s;  
        return ;  
    }  
    p->rear->next=s;  
    p->rear=s;  
}  
type_queue Pop(Queue *p){  
    if(Is_empty(p)){  
        printf("below flow\n");  
        return -1;  
    }  
    type_queue x=p->front->x;  
    if(p->front->next==NULL){  
        free(p->front);  
        p->front=p->rear=NULL;  
        return x;  
    }  
    Node *s=p->front;  
    p->front=s->next;  
    free(s);  
    return x;  
}  
  
type_queue Get_top(Queue *p){  
    if(Is_empty(p)){  
        printf("the Queue is empty\n");  
        return -1;  
    }  
    return p->front->x;  
}  
  
void Init_queue(Queue *p){  
    p->front=p->rear=NULL;  
}  
void Clear_queue(Queue *p){  
    while(!Is_empty(p))  
        Pop(p);  
}  
//================
//typedef int type_data;
typedef struct Arc{ //边结点
	int number;
	int value;
	struct Arc *next;
}ArcNode;
typedef struct{ //表头结点
	type_queue data;
	ArcNode *first;
}VertexNode;
typedef struct{ //图
	int n;//结点数
	int m;//边数
	VertexNode tex[Max];
}AdjList;
void Creat_grap(AdjList *g){
	scanf("%d%d",&g->n,&g->m);
	int i,s,t,val;
	for(i=1;i<=g->n;i++){
		scanf("%d",&g->tex[i].data);
		g->tex[i].first=NULL;
	}
	for(i=0;i<g->m;i++){
		scanf("%d%d%d",&s,&t,&val);
		ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));
        p->number=t;
        p->value=val;
        p->next=g->tex[s].first;
        g->tex[s].first=p;
        ArcNode *q=(ArcNode*)malloc(sizeof(ArcNode));  //当为有向图时不能写
        q->number=s;
        q->value=val;
        q->next=g->tex[t].first;
        g->tex[t].first=q;
		
	}
}
void Clear(AdjList *g){
	for(int i=1;i<=g->n;i++){
		ArcNode *p=g->tex[i].first;
		while(p){
			ArcNode *q=p->next;
			free(p);
			p=q;
		}
	}
}
/*void dfs(AdjList *g,int index){
	printf("正在访问结点%d ,其数据为:%d \n",index,g->tex[index].data);
	visit[index]=true;
	ArcNode *p=g->tex[index].first;
	while(p){
		if(!visit[p->number])
			dfs(g,p->number);
		p=p->next;
	}
}
void Edfs(AdjList *g){
	memset(visit,false,sizeof(visit));
	for(int i=1;i<=g->n;i++){
		if(!visit[i])
			dfs(g,i);
	}
}*/
void bfs(AdjList *g,int index){
	Queue que;
	Init_queue(&que);
	Push(&que,index);
	printf("正在访问结点%d ,其数据为:%d \n",index,g->tex[index].data);
	visit[index]=true;
	while(!Is_empty(&que)){
		//printf("%d\n",Get_top(&que));
		int pivot=Pop(&que);
		//printf("正在访问结点%d ,其数据为:%d \n",pivot,g->tex[pivot].data);
		//visit[pivot]=true;
		ArcNode *p=g->tex[pivot].first;
		while(p){
			if(!visit[p->number]){
				printf("正在访问结点%d ,其数据为:%d \n",p->number,g->tex[p->number].data);
				visit[p->number]=true;
				Push(&que,p->number);
			}
			p=p->next;
		}
	}
}

void Ebfs(AdjList *g){
	memset(visit,false,sizeof(visit));
	for(int i=1;i<=g->n;i++){
		if(!visit[i])
			bfs(g,i);
	}
}

int main()
{
	AdjList g;
	Creat_grap(&g);
	/*for(int i=1;i<=g.n;i++){
		//printf("skjdfhsdkh\n");
	ArcNode *p=g.tex[i].first;
    while(p){
		printf("%d ",p->number);
		p=p->next;
	}
	printf("\n");
	}*/
	Ebfs(&g);
	Clear(&g);
	return 0;
}


数据为

8 10
1 2 3 4 5 6 7 8
1 3 8
1 2 8
2 5 8
2 4 8
3 7 8
3 6 8
7 8 8
6 8 8
5 8 8
4 8 8

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值