带视频教程的哈夫曼树深度,广度遍历——邻接表法。

提醒一点:可能高版本的vs 中 scanf 要改成scanf_s要不会报错 具体原因:为什么用scanf_s
但是可以改掉:详情

#include"stdio.h"
#include"stdlib.h"
#define MaxVertexNum 50          //定义最大顶点数
typedef struct node {       //边表结点
	int adjvex;          //邻接点域
	struct node *next;   
}EdgeNode;
typedef struct vnode {      //顶点表结点
	char vertex;          //顶点域
	EdgeNode *firstedge;  //边表头指针
}VertexNode, AdjList[MaxVertexNum];
        //AdjList是邻接表类型
typedef struct {
	AdjList adjlist;      //邻接表
	int n, e;              //图中当前顶点数和边数
} ALGraph;                //图类型
//建立图的邻接表
void CreatALGraph(ALGraph *G)
{
	int i, j, k;
	char a;
	EdgeNode *s;          //定义边表结点
	printf("Input VertexNum(n) and EdgesNum(e): ");
	scanf("%d,%d", &G->n, &G->e);      //读入顶点数和边数
	scanf("%c", &a);
	printf("Input Vertex string:");
	for (i = 0; i < G->n; i++)         //建立边表
	{
		scanf("%c", &a);
		G->adjlist[i].vertex = a;      //读入顶点信息
		G->adjlist[i].firstedge = NULL; //边表置为空表
	}
	printf("Input edges,Creat Adjacency List\n");
	for (k = 0; k < G->e; k++) {        //建立边表     
		scanf("%d%d", &i, &j);         //读入边(Vi,Vj)的顶点对序号
		s = (EdgeNode *)malloc(sizeof(EdgeNode));   //生成边表结点
		s->adjvex = j;                 //邻接点序号为j
		s->next = G->adjlist[i].firstedge;
		G->adjlist[i].firstedge = s;    //将新结点*S插入顶点Vi的边表头部
		s = (EdgeNode *)malloc(sizeof(EdgeNode));
		s->adjvex = i;                  //邻接点序号为i
		s->next = G->adjlist[j].firstedge;
		G->adjlist[j].firstedge = s;     //将新结点*S插入顶点Vj的边表头部
	}
}
//定义标志向量,为全局变量
typedef enum { FALSE, TRUE } Boolean;
Boolean visited[MaxVertexNum];
//DFS:深度优先遍历的递归算法
void DFSM(ALGraph *G, int i)
{                     //以Vi为出发点对邻接链表表示的图G进行DFS搜索
	EdgeNode *p;
	printf("%c", G->adjlist[i].vertex);   //访问顶点Vi
	visited[i] = TRUE;                     //标记Vi已访问
	p = G->adjlist[i].firstedge;           //取Vi边表的头指针
	while (p) {              //依次搜索Vi的邻接点Vj,这里j=p->adjvex
		if (!visited[p->adjvex])      //若Vj尚未被访问
			DFSM(G, p->adjvex);       //则以Vj为出发点向纵深搜索
		p = p->next;                   //找Vi的下一个邻接点
	}
}
void DFS(ALGraph *G)
{
	int i;
	for (i = 0; i < G->n; i++)
		visited[i] = FALSE;            //标志向量初始化
	for (i = 0; i < G->n; i++)
		if (!visited[i])               //Vi未访问过 	    
			DFSM(G, i);               //以Vi为源点开始DFS搜索 
}
//BFS:广度优先遍历
void BFS(ALGraph *G, int k) {           //以Vk为源点对用邻接链表表示的图G进行广度优先搜索
	int i, f = 0, r = 0;
	EdgeNode *p;
	int cq[MaxVertexNum];        //定义FIFO队列     
	for (i = 0; i < G->n; i++)
		visited[i] = FALSE;	         //标志向量初始化
	for (i = 0; i <= G->n; i++)
		cq[i] = -1;                         //初始化标志向量
	printf("%c", G->adjlist[k].vertex);//访问源点Vk
	visited[k] = TRUE;
	cq[r] = k;      //Vk已访问,将其入队。注意,实际上是将其序号入队 
	while (cq[f] != -1) {   //队列非空则执行
		i = cq[f]; f = f + 1;               //Vi出队
		p = G->adjlist[i].firstedge;    //取Vi的边表头指针
		while (p) {         //依次搜索Vi的邻接点Vj(令p->adjvex=j)
			if (!visited[p->adjvex]) {           //若Vj未访问过
				printf("%c", G->adjlist[p->adjvex].vertex);     //访问Vj
				visited[p->adjvex] = TRUE;
				r = r + 1; cq[r] = p->adjvex;           //访问过的Vj入队
			}
			p = p->next;              //找Vi的下一个邻接点
		}
	}//endwhile
}
//主函数
void main()
{
	int i;
	ALGraph *G;
	G = (ALGraph *)malloc(sizeof(ALGraph));
	CreatALGraph(G);
	printf("Print Graph DFS: ");
	DFS(G);
	printf("\n");
	printf("Print Graph BFS: ");
	BFS(G, 3);
	printf("\n");
	getchar();
}

如果对该代码有什么看不懂的:这里有视频详解
另外我的另一篇博客有有关邻接矩阵法的代码。大家有兴趣可以去我主页看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肥学

感谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值