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

图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问且只访问一次。

深度优先遍历:

算法描述:

(1)访问结点v。

(2)找到v的第一个邻接点w。

(3)如果邻接点w存在且未被访问,则从w出发深度优先遍历图;否则,结束。

(4)找顶点v关于w的下一个邻接点,转(3)。

完整代码:

#include "stdio.h"
#include "stdlib.h"
#define  N 5
 struct node            /*图顶点结构*/
{
	int peak;              //邻接顶点数据
	struct node *next;
};
 typedef struct node *graph;        //图结构
 struct node head[N];
 int visited[N];
 void Dfs(int peak);
 void Create(int peak1, int peak2)
 {
	 graph p, q;
	 q = (graph)malloc(sizeof(struct node));
	 if (q!=NULL)
	 {
		 q->peak = peak2;
		 q->next = NULL;
		 p = &(head[peak1]);
		 while (p->next!=NULL)
		 {
			 p = p->next;
		 }
		 p->next = q;
	 }
 }
 void visit(int peak)
 {
	 int i;
	 for (i = 0; i < N; i++)
	 {
		 visited[i] = 0;
	 }
	 for (i = 0; i < N;i++)
	 {
		 if (visited[i]== 0)
		 {
			 Dfs(peak);
		 }
	 }
 }
 void Dfs(int peak)
 {
	 graph p;
	 printf("%d访问", peak);                          //访问顶点peak
	 visited[peak] = 1;
	 p = head[peak].next;                 //找第一个邻接点
	 while (p != NULL)
	 {
		 if (visited[p->peak]==0)
		 {
			 Dfs(p->peak);
		 }
		 p = p->next;
	 }
 }
 void Show(struct node *head)
 {
	 graph p;
	 p = head->next;
	 while (p!=NULL)
	 {
		 printf(" [%d] ", p->peak);
		 p = p->next;
	 }
	 printf("\n");
 }
 int main()
 {
	 int node[8][2]=
	 {
		 {1,2},{1,3},{2,1},{2,4},{3,1},{3,4},{4,2},{4,3}
	 };
	 int i;
	 for (i = 0; i < 8;i++)
	 {
		 Create(node[i][0], node[i][1]);
	 }
	 printf("图的邻接表存储为:\n");
	 for (i = 1; i < N;i++)
	 {
		 printf("[%d] ", i);
		 Show(&head[i]);
	 }
	 printf("图的深度优先遍历结果\n");
	 visit(1);
	 printf("结束\n");
	 return 0;
 }

广度优先遍历:

算法描述:

(1)设图G的初态是所有顶点未被访问,设置辅助队列Q,队列Q为空。

(2)任选一个未被访问过的顶点v作为遍历起点。

(3)访问v,并将v入队列,将v标为已访问。

(4)若队列Q不空,取出一个顶点v。

(5)查找v的所有未被访问的邻接点vi并对其访问,并入队列,转(4),直到队列为空。

(6)若此时还有未被访问过的结点,转(2),否则结束。

完整代码:

#include "stdio.h"
#include "stdlib.h"
#define  N 5
typedef struct queue                                 //队的存储结构
{
	int data;
	struct queue *next;
}Queue;
typedef struct
{
	Queue *front;
	Queue *rear;
}qnode;
struct node            /*图顶点结构*/
{
	int peak;              //邻接顶点数据
	struct node *next;
};
typedef struct node *graph;        //图结构
struct node head[N];
int visited[N];

void Create(int peak1,int peak2);
void Show(struct node *head);
void BFS(int peak);
void Visit(int peak);
void InitQueue(qnode *p);
void In(qnode *p,int x);
int Empty(qnode *p);
int Out(qnode *p);

void InitQueue(qnode *p)                               //队的初始化
{
	p->front = p->rear = NULL;
}

void In(qnode *p,int x)                                //入队
{
	Queue *q;
	q = (Queue*)malloc(sizeof(Queue));
	if (q!=NULL)
	{
		q->data = x;
		q->next = NULL;
	}
	if (Empty(p)==1)
	{
	/*	p->front->data = p->rear->data = x;*/
		p->front = p->rear = q;
	}
	else
	{
		p->rear->next = q;
		p->rear = q;
	}
}
int Empty(qnode *p)                                           //判断队是否为空
{
	return((p->front == NULL) && (p->rear == NULL));
}
int Out(qnode *p)
{
	int x;
	Queue *q;
	if (Empty(p) == 0)
	q = p->front;
	x = q->data;
	p->front = q->next;
	if (p->rear == q)                    //如果出队后为空队
	{
		p->rear = NULL;
	}
	free(q);
	return x;
}
void Create(int peak1, int peak2)
{
	graph p, q;
	q = (graph)malloc(sizeof(struct node));
	if (q != NULL)
	{
		q->peak = peak2;
		q->next = NULL;
		p = &(head[peak1]);
		while (p->next != NULL)
		{
			p = p->next;
		}
		p->next = q;
	}
}
void Show(struct node *head)
{
	graph p;
	p = head->next;
	while (p!=NULL)
	{
		printf("[%d]", p->peak);
		p = p->next;
	}
	printf("\n");
}
void Visit(int peak)
{
	int i;
	for (i = 0; i < N;i++)
	{
		visited[i] = 0;
	}
	for (i = 0; i < N; i++)
	{
		if (visited[i] == 0)
		{
			BFS(peak);
		}
	}
}
void BFS(int peak)
{
	graph p;
	qnode Q;
	InitQueue(&Q);
	printf("[%d]访问", peak);
	visited[peak] = 1;
	In(&Q, peak);
	int v, k;
	while (!Empty(&Q))
	{
		v = Out(&Q);
		p = head[v].next;
		while (p != NULL)
		{
			k = p->peak;
			if (visited[k] == 0)
			{
				printf("[%d]访问", k);
				In(&Q, k);
				visited[k] = 1;
			}
			p = p->next;
		}
	}
}
int main()
{
	int node[8][2] =
	{
		{ 1,2 },{ 1,3 },{ 2,1 },{ 2,4 },{ 3,1 },{ 3,4 },{ 4,2 },{ 4,3 }
	};
	int i;
	for (i = 0; i < 8; i++)
	{
		Create(node[i][0], node[i][1]);
	}
	printf("图的邻接表存储为:\n");
	for (i = 1; i < N; i++)
	{
		printf("[%d] ", i);
		Show(&head[i]);
	}
	printf("图的广度优先遍历结果\n");
	Visit(1);
	printf("结束\n");
	return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值