// 8.2 以邻接链表作为存储结构
/*****************************/
/* 图和函数定义 */
/*****************************/
// #include "stdio.h"
// #include "stdlib.h"
//c++ 的queue
#include <queue>
#include <iostream>
using namespace std;
#define MaxVertexNum 50 //定义最大顶点数
typedef struct node{ //边表结点
int adjvex; //邻接点域
struct node *next; //链域
} EdgeNode;
typedef struct vnode{ //顶点表结点
char vertex; //顶点域
EdgeNode *firstedge; //边表头指针
} VertexNode;
typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型
typedef struct{
AdjList adjlist; //邻接表
int n,e; //图中当前顶点数和边数
} ALGraph; //图类型
typedef enum{FALSE,TRUE} Boolean;
Boolean visited[MaxVertexNum]; //定义数组保存访问的状态
/*****************************/
/* 建立邻接链表 */
/*****************************/
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的边表头部
}
}
/*****************************/
/* 主函数 */
/*****************************/
int main()
{
void BFS(ALGraph *G, int k) ;
void DFSM(ALGraph *G, int i);
void DFS(ALGraph *G);
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");
return 0;
}
// 9.2 以邻接链表作为存储结构
/***********************************/
/* BFS:广度优先遍历 */
/* (以节点k为出发点) */
/***********************************/
void BFS(ALGraph *G, int k)
{
//创建存储头结点的队列
queue <VertexNode> headList;
//初始化visited[]数组
for (int i = 0; i < G->n; i++){
visited[i]=FALSE;
}
//将原点加入到队列
headList.push(G->adjlist[k]);
visited[k]=TRUE;
//
for (int i = 0; i < G->n; i++){
//获取队列队首元素信息
VertexNode VertexNodeList=headList.front();
printf("%c",VertexNodeList.vertex);
//队首元素就出队
headList.pop();
//获取边表结点信息
EdgeNode *EdgeNodePtr=VertexNodeList.firstedge;
while(EdgeNodePtr!=NULL){
//如果没有被访问过,那么入队并且将visited数组的值置为true
if(visited[EdgeNodePtr->adjvex]==FALSE){
//所有邻接边表结点入队
headList.push(G->adjlist[EdgeNodePtr->adjvex]);
//将visited数组的值置为true
visited[EdgeNodePtr->adjvex]=TRUE;
}
//遍历下一个元素
EdgeNodePtr=EdgeNodePtr->next;
}
}
}
/***********************************/
/* DFS:深度优先遍历 */
/* (递归部分:以节点i为出发点) */
/***********************************/
void DFSM(ALGraph *G, int i){
//输出这个元素的值
printf("%c",G->adjlist[i].vertex);
visited[i]=TRUE;
EdgeNode *EdgeNodePtr=G->adjlist[i].firstedge;
while(EdgeNodePtr!=NULL){
//如果没有被访问过,那么入队并且将visited数组的值置为true
if(visited[EdgeNodePtr->adjvex]==FALSE){
// visited[EdgeNodePtr->adjvex]=TRUE;
DFSM(G,EdgeNodePtr->adjvex);
}
EdgeNodePtr=EdgeNodePtr->next;
}
}
/**************************************************/
/* DFS:深度优先遍历 */
/* (初始化部分:初始化访问数组,调用DFSM) */
/**************************************************/
void DFS(ALGraph *G){
//初始化visited数组
for (int i = 0; i < G->n; i++){
visited[i]=FALSE;
}
//寻找第一个非空节点,并以此结点开始递归(题中所给是0结点开始)
int i;
for (i = 0; i < G->n; i++){
if(G->adjlist[i].firstedge!=NULL){
DFSM(G,i);
break;
}
}
}
数据结构 邻接链表方式存储/广度遍历/深度遍历 图
最新推荐文章于 2021-10-29 20:31:52 发布